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

是什么? 什么时候使用? 我能得到哪些福利?


当前回答

由于最初的问题是关于SerializableAttribute的,因此应该注意,该属性仅适用于使用BinaryFormatter或SoapFormatter时。

这有点令人困惑,除非你真的注意到细节,比如什么时候使用它,它的实际用途是什么。

它与XML或JSON序列化无关。

与SerializableAttribute一起使用的是serialalizable接口和SerializationInfo类。这些也只与BinaryFormatter或SoapFormatter一起使用。

除非您打算使用Binary或Soap序列化您的类,否则不要费心将您的类标记为[Serializable]。XML和JSON序列化器甚至不知道它的存在。

其他回答

下面是一个关于序列化如何工作的简短示例。我也在学习同样的东西,我发现两个链接很有用。 什么是序列化以及如何在。net中实现序列化。

一个解释序列化的示例程序

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

序列化是将对象转换为字节流以存储对象或将其传输到内存、数据库或文件的过程。 序列化的工作原理 下图显示了序列化的整个过程: 对象被序列化为携带数据的流。流还可能包含关于对象类型的信息,例如它的版本、区域性和程序集名称。从该流中,对象可以存储在数据库、文件或内存中。

微软文档中的详细信息。

由于最初的问题是关于SerializableAttribute的,因此应该注意,该属性仅适用于使用BinaryFormatter或SoapFormatter时。

这有点令人困惑,除非你真的注意到细节,比如什么时候使用它,它的实际用途是什么。

它与XML或JSON序列化无关。

与SerializableAttribute一起使用的是serialalizable接口和SerializationInfo类。这些也只与BinaryFormatter或SoapFormatter一起使用。

除非您打算使用Binary或Soap序列化您的类,否则不要费心将您的类标记为[Serializable]。XML和JSON序列化器甚至不知道它的存在。

序列化:

对象写入文件/网络或任何地方的状态。

反序列化:

从文件/网络或任何地方读取对象状态。

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

Saving object state using binary serialisation; you can very easily 'save' entire object instances in your application to a file or network stream and then recreate them by deserialising - check out the BinaryFormatter class in System.Runtime.Serialization.Formatters.Binary Writing classes whose object instances can be stored on the clipboard using Clipboard.SetData() - nonserialisable classes cannot be placed on the clipboard. Writing classes which are compatible with .NET Remoting; generally, any class instance you pass between application domains (except those which extend from MarshalByRefObject) must be serialisable.

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