C# 什么是[Serializable],什么时候应该使用它?
我发现有些类使用C# 什么是[Serializable],什么时候应该使用它?,c#,.net,serialization,C#,.net,Serialization,我发现有些类使用[Serializable]属性 这是什么 我应该什么时候用 我会得到什么样的好处 这是什么? 在.Net framework应用程序中创建对象时,不需要考虑数据如何存储在内存中。因为.Net框架为您解决了这一问题。但是,如果要将对象的内容存储到文件、将对象发送到另一个进程或通过网络传输,则必须考虑对象的表示方式,因为需要转换为不同的格式。这种转换称为序列化 用于序列化 序列化允许开发人员保存对象的状态并根据需要重新创建它,从而提供对象存储和数据交换。通过序列化,开发人员可以执
[Serializable]
属性
- 这是什么李>
- 我应该什么时候用李>
- 我会得到什么样的好处李>
传输或保存数据时,只需发送或保存所需的数据。因此,传输延迟和存储问题将减少。因此,您可以在序列化时选择不必要的数据块。对
[Serializable]
属性的一些实际用途:
- 使用二进制序列化保存对象状态;您可以非常轻松地将应用程序中的整个对象实例“保存”到文件或网络流中,然后通过反序列化重新创建它们-查看System.Runtime.Serialization.Formatters.Binary中的
类BinaryFormatter
- 使用
写入对象实例可以存储在剪贴板上的类-不能将不可序列化的类放置在剪贴板上clipboard.SetData()
- 编写与.NET远程处理兼容的类;通常,在应用程序域之间传递的任何类实例(从
扩展的类实例除外)都必须是可序列化的MarshalByRefObject
这些是我遇到的最常见的用例。这里是序列化工作原理的简短示例。我也了解到了这一点,我发现两个链接很有用。 如果您不理解上述程序,将给出一个非常简单的程序并进行解释 序列化是将对象转换为字节流以存储该对象或将其传输到内存、数据库或文件的过程 序列化的工作原理 此图显示序列化的整个过程: 对象被序列化为携带数据的流。流还可能包含有关对象类型的信息,例如其版本、区域性和程序集名称。从该流中,对象可以存储在数据库、文件或内存中
有关详细信息,请参见。序列化
[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
}
}
序列化是将一个对象或一组对象图形转换为流的过程,在二进制序列化的情况下是字节数组
序列化的使用
[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
}
}
[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();
}
}
因为最初的问题是关于SerializableAttribute的,所以应该注意,此属性仅在使用BinaryFormatter或SoapFormatter时适用 这有点令人困惑,除非你真的注意细节,比如什么时候使用它以及它的实际用途
它与XML或JSON序列化无关 与SerializableAttribute一起使用的是ISerializable接口和SerializationInfo类。它们也仅用于BinaryFormatter或SoapFormatter
除非您打算使用二进制或Soap序列化类,否则不要麻烦将类标记为[Serializable]。XML和JSON序列化程序甚至不知道它的存在。
它是什么?
一个实用的用法解释