我发现一些类使用[Serializable]属性。
是什么? 什么时候使用? 我能得到哪些福利?
我发现一些类使用[Serializable]属性。
是什么? 什么时候使用? 我能得到哪些福利?
当前回答
由于最初的问题是关于SerializableAttribute的,因此应该注意,该属性仅适用于使用BinaryFormatter或SoapFormatter时。
这有点令人困惑,除非你真的注意到细节,比如什么时候使用它,它的实际用途是什么。
它与XML或JSON序列化无关。
与SerializableAttribute一起使用的是serialalizable接口和SerializationInfo类。这些也只与BinaryFormatter或SoapFormatter一起使用。
除非您打算使用Binary或Soap序列化您的类,否则不要费心将您的类标记为[Serializable]。XML和JSON序列化器甚至不知道它的存在。
其他回答
序列化
序列化是将一个对象或一组对象图转换为流的过程,在二进制序列化的情况下是一个字节数组
序列化的用途
保存一个对象的状态到一个文件,数据库等,并在以后使用它。 将一个对象从一个进程发送到同一机器上的另一个进程(应用程序域),也可以通过有线发送到运行在另一台机器上的进程。 在处理主对象时创建原始对象的克隆作为备份。 一组对象可以很容易地复制到系统的剪贴板,然后粘贴到相同或另一个应用程序
下面是在对象序列化期间使用的一些有用的自定义属性
[Serializable] ->当我们标记一个对象的Serializable时使用 [NonSerialized] ->当我们不想序列化一个对象的字段时使用。 [OnSerializing] ->当我们想在序列化对象时执行一些操作时使用 [OnSerialized] ->当我们想在序列化一个对象到流后执行一些操作时使用。
下面是序列化的示例
[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();
}
}
下面是一个关于序列化如何工作的简短示例。我也在学习同样的东西,我发现两个链接很有用。 什么是序列化以及如何在。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.
这些是我遇到的最常见的用例。
序列化:
对象写入文件/网络或任何地方的状态。
反序列化:
从文件/网络或任何地方读取对象状态。