什么是什么时候应该使用它?
我发现有些类使用[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的过程,在二进制序列化的情况下它是一个字节数组
序列化的用法
- 将对象的状态保存到文件,数据库等中,并使用它。
- 在同一台机器上将一个对象从一个进程发送到另一个进程(App Domain),并通过线路将其发送到另一台机器上运行的进程。
- 在处理主对象时创build原始对象的克隆作为备份。
- 一组对象可以很容易地复制到系统的剪贴板,然后粘贴到同一个或另一个应用程序中
以下是在对象序列化过程中使用的一些有用的自定义属性
[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(); } }