[Serializable]
属性。这是什么?
我什么时候应该使用它?
我将获得哪些好处?
#1 楼
是什么?在.Net Framework应用程序中创建对象时,无需考虑数据如何存储在内存中。因为.Net Framework会为您解决这一问题。但是,如果要将对象的内容存储到文件,将对象发送到另一个进程或通过网络传输它,则必须考虑对象的表示方式,因为您需要转换为其他格式。这种转换称为SERIALIZATION。
用于序列化
序列化使开发人员可以保存对象的状态并根据需要重新创建它,从而提供对象的存储以及数据交换。通过序列化,开发人员可以执行一些操作,例如通过Web服务将对象发送到远程应用程序,将对象从一个域传递到另一个域,将对象作为XML字符串通过防火墙传递,或维护安全性或特定于用户的行为。跨应用程序提供信息。
将
SerializableAttribute
应用于一种类型,以指示可以序列化此类型的实例。即使该类也实现了SerializableAttribute
接口来控制序列化过程,也要应用ISerializable
。默认情况下,将序列化由
SerializableAttribute
标记的类型的所有公共和私有字段,除非该类型实现了覆盖序列化过程。默认序列化过程不包括标有ISerializable
的字段。如果可序列化类型的字段包含特定于特定环境的指针,句柄或某些其他数据结构,并且无法在其他环境中进行有意义的重构,那么您可能需要将NonSerializedAttribute
应用于该字段。 />有关更多详细信息,请参见MSDN。传输或保存数据时,只需要发送或保存所需的数据。因此,将减少传输延迟和存储问题。因此,您可以在序列化时选择不必要的数据块。评论
很好的解释,很高兴将其添加到MSDN中的属性=)
– Martea
18 Mar 22 '18在9:31
@jayasurya_j很可惜,被接受的答案并没有太多谈论私人部分
–亚历山大
18年6月21日在14:14
很好的解释
– Zakir HC
20年1月30日,下午5:59
#2 楼
由于最初的问题是关于SerializableAttribute的,因此应注意,此属性仅在使用BinaryFormatter或SoapFormatter时适用。它与XML或JSON序列化无关。
与SerializableAttribute一起使用的是ISerializable接口和SerializationInfo类。这些也只能与BinaryFormatter或SoapFormatter一起使用。 XML和JSON序列化程序甚至都不知道它的存在。
评论
“它与XML或JSON序列化无关”-谢谢!最后一个解释,为什么我可以使用或不使用此属性来愉快地将任何类序列化为XML
–userSteve
18年8月2日在12:48
你有这个来源吗?
– Michiel van Oosterhout
19年5月22日在16:11
“ XML和JSON序列化程序甚至都不知道它的存在”。我不知道当我通过WCF JSON格式化一个类时,如果该类是可序列化的,则属性名称前面带有一个下划线,并且在删除属性时没有。因此可能会有一些干扰。
–詹斯
19年8月14日在8:28
@Jens如果我正确理解JSON.net一点也不在乎,但是asp.net会稍微改变这种行为。我相信您可以使用JsonObject / JsonProperty属性来规避此问题。
–基础
19年8月23日在6:23
这里的一个类似问题的支持答案:stackoverflow.com/a/12461510/388664
– NikolaMalešević
20/07/29在8:25
#3 楼
[Serializable]
属性的一些实际用途:使用二进制序列化保存对象状态;您可以非常轻松地将应用程序中的整个对象实例“保存”到文件或网络流,然后通过反序列化来重新创建它们-在System.Runtime.Serialization.Formatters.Binary
中编写
BinaryFormatter
类,编写其对象实例的类可以使用Clipboard.SetData()
存储在剪贴板上-不能将不可序列化的类放置在剪贴板上。通常,在应用程序域之间传递的任何类实例(从MarshalByRefObject
扩展的类实例除外)都必须是可序列化的。这些是我遇到的最常见的用例。
#4 楼
串行化是将对象转换为字节流以存储对象或将其传输到内存,数据库或文件的过程。
序列化的工作方式
此图显示了整体序列化过程:
对象被序列化为承载数据的流。流还可能包含有关对象类型的信息,例如其版本,区域性和程序集名称。通过该流,可以将对象存储在数据库,文件或内存中。
Microsoft Docs中的详细信息。
#5 楼
这是序列化工作原理的简短示例。我也在学习相同的东西,发现两个有用的链接。什么是序列化,以及如何在.NET中完成。 />如果您不理解上述程序,请在此处给出一个简单的程序并进行说明。
#6 楼
序列化序列化是将一个对象或一组对象图转换为流的过程,对于二进制序列化,它是一个字节数组。
序列化的用途
将对象的状态保存到文件,数据库等中,并在以后使用。
将对象从同一进程的一个进程发送到另一个进程(App Domain)机器,并通过电线将其发送到在另一台机器上运行的进程。
在对主要对象进行操作时创建原始对象的副本作为备份。
可以轻松地将一组对象复制到系统的剪贴板,然后粘贴到相同或另一个应用程序中
下面是一些有用的自定义属性,这些属性在对象序列化期间使用
[Serializable]->当我们标记对象的可序列化
[NonSerialized]->当我们不想序列化对象的字段时使用。
[OnSerializing]->当我们要执行一些动作时使用在序列化对象时打开
[OnSerialized]->当我们要将对象序列化为流后要执行某些操作时使用。 br />
[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();
}
}
评论
它是什么? stackoverflow.com/questions/3429921/what-does-serializable-meanmsdn.microsoft.com/zh-CN/library / ...
这是我发现的实用用法说明。