什么是什么时候应该使用它?

我发现有些类使用[Serializable]属性。

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

它是什么?

在.Net框架应用程序中创build对象时,不需要考虑数据如何存储在内存中。 因为.Net框架为你照顾。 但是,如果要将对象的内容存储到文件中,请将对象发送到另一个进程或通过networking传输,则必须考虑对象是如何表示的,因为您需要将其转换为其他格式。 这种转换称为SERIALIZATION。

用于序列化

序列化允许开发人员保存对象的状态并根据需要重新创build对象,提供对象的存储以及数据交换。 通过序列化,开发人员可以执行如下操作:通过Web服务将对象发送到远程应用程序,将对象从一个域传递到另一个域,将对象作为XMLstring传递到防火墙,或者维护安全性或用户特定跨应用程序的信息

SerializableAttribute应用于types以指示可以序列化此types的实例。 即使该类也实现了ISerializable接口来控制序列化过程,也可以应用SerializableAttribute

除非types实现ISerializable接口来覆盖序列化过程,否则所有由SerializableAttribute标记的types中的公共和私有字段都将被默认序列化。 默认序列化过程排除用NonSerializedAttribute标记的字段。 如果可序列化types的字段包含特定于特定环境的指针,句柄或某些其他数据结构,并且不能在不同环境中有意义地重构,那么您可能需要将NonSerializedAttribute应用于该字段。

请参阅MSDN了解更多详情。

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

  • 使用二进制序列化保存对象状态; 你可以非常容易地将应用程序中的整个对象实例保存到文件或networkingstream中,然后通过反序列化来重新创build它们 – 查看System.Runtime.Serialization.Formatters.Binary中的BinaryFormatter
  • 使用Clipboard.SetData()编写其对象实例可存储在剪贴板上的类 – 不能将序列放置在剪贴板上。
  • 编写与.NET Remoting兼容的类; 通常,在应用程序域之间传递的任何类实例(除了从MarshalByRefObject扩展的那些实例)必须是可串行化的。

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

这是序列化如何工作的简短例子。 我也学习了相同的,我发现两个有用的链接。 什么序列化是以及如何在.NET中完成 。

解释序列化的示例程序

如果你不理解上面的程序, 这里给出一个简单的解释程序。

序列化是将对象转换为字节stream以存储对象或将其传输到内存,数据库或文件的过程。

序列化如何工作

这个插图显示了序列化的整个过程。

在这里输入图像描述

该对象被序列化为一个stream,该stream不仅包含数据,还包含有关对象types的信息,如版本,文化和程序集名称。 从这个stream,它可以存储在数据库,文件或内存中。

msdn中的详细信息

序列化

序列化是将一个对象或一组对象图转换成一个stream的过程,在二进制序列化的情况下它是一个字节数组

序列化的用法

  1. 将对象的状态保存到文件,数据库等中,并使用它。
  2. 在同一台机器上将一个对象从一个进程发送到另一个进程(App Domain),并通过线路将其发送到另一台机器上运行的进程。
  3. 在处理主对象时创build原始对象的克隆作为备份。
  4. 一组对象可以很容易地复制到系统的剪贴板,然后粘贴到同一个或另一个应用程序中

以下是在对象序列化过程中使用的一些有用的自定义属性

[Serializable] – >它用于标记对象的可序列化[NonSerialized] – >当我们不想序列化对象的字段时使用它。 [OnSerializing] – >当我们想要在序列化一个对象的时候执行一些动作时使用它[OnSerialized] – >当我们想要在将一个对象序列化到stream中之后执行一些动作的时候使用它。

下面是序列化的例子

 [Serializable] internal class DemoForSerializable { internal string Fname = string.Empty; internal string Lname = string.Empty; internal Stream SerializeToMS(DemoForSerializable demo) { DemoForSerializable objSer = new DemoForSerializable(); MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, objSer); return ms; } [OnSerializing] private void OnSerializing(StreamingContext context) { Fname = "sheo"; Lname = "Dayal"; } [OnSerialized] private void OnSerialized(StreamingContext context) { // Do some work after serialized object } } 

这是调用代码

 class Program { string fname = string.Empty; string Lname = string.Empty; static void Main(string[] args) { DemoForSerializable demo = new DemoForSerializable(); Stream ms = demo.SerializeToMS(demo); ms.Position = 0; DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable; Console.WriteLine(demo1.Fname); Console.WriteLine(demo1.Lname); Console.ReadLine(); } }