CSharp - 在C#中,什么时候应该使用[ Serializable]?

  显示原文与译文双语对照的内容

我发现一些类使用了这个 [Serializable] 属性。

  • 是什么?
  • 应该什么时候使用它?
  • 我将获得什么样的好处?

请用简单的例子解释我,因为我只是初学者。

时间:

是什么?

在. NET 框架应用程序中创建对象时,不需要考虑数据如何存储在内存中。 因为. NET 框架为你负责。 但是,如果要将对象的内容存储到文件中,将对象发送到另一个进程或者通过网络传输,你必须考虑如何将该对象转换成不同的格式。 这里转换称为序列化。

用于序列化

序列化允许开发人员保存对象的状态并根据需要重新创建对象,提供对象存储和数据交换。 通过序列化,开发人员可以执行诸如通过网络服务将对象发送到远程应用程序的操作,将对象从一个域传递到另一个域,或者通过防火墙传递安全或者user-specific信息。

SerializableAttribute 属性应用于类型,以指示这里类型的实例可以序列化。 应用 SerializableAttribute 属性,即使该类也实现 ISerializable 接口来控制序列化过程。

默认情况下,SerializableAttribute 中的所有公共和私有字段都是序列化的。该类型实现 ISerializable 接口以重写序列化过程。 默认序列化进程排除用 NonSerializedAttribute 属性标记的字段。 如果可以序列化类型的字段包含特定于某个特定环境的点,句柄或者其他数据结构,则不能在不同的环境中进行重建,然后将 NonSerializedAttribute 属性应用于该字段。

有关详细信息,请参阅 MSDN

[Serializable] 属性的一些实际用法:

  • 节约使用二进制序列化对象状态;你可以很容易地'保存'整个对象实例在你的应用程序到一个文件或网络流,然后重新创建它们deserialising-查看 System.Runtime.Serialization.Formatters.Binary BinaryFormatter
  • 使用 Clipboard.SetData() - nonserialisable类将对象实例存储在剪贴板上的类不能放在剪贴板上。
  • 编写与. NET 远程处理兼容的类;通常,在应用程序域( 除了那些从 MarshalByRefObject 扩展的) 之间传递的任何类实例都必须是 serialisable 。

这些是我遇到的最常见的用例。

下面是序列化工作原理的简短示例。 我也在学习,我发现了两个有用的链接。 序列化是什么以及如何在. NET http://msdn.microsoft.com/en-us/library/vstudio/ms233843.aspx 中完成一个示例程序解释序列化http://blog.kowalczyk.info/article/8n/Serialization-in-C.html

如果你不理解上面的程序,那么这里给出了一个简单的解释程序 http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=94

...