Serializable不是.net的核心概念
先是开发人员有需求,说我需要序列化反序列化啊,这是个常用功能,于是有人(只不过这个个恰好是微软)做了个工具类
然后需求又说,我这个类里的字段不想全放序列化里啊,这个要序列化那个属性不要。工具类作者说了,那你得传参数啊,直接放方法参数里太麻烦了,每次都要传一堆,干脆用属性标记出来吧,于是有了NonSerialized一干特性,不想序列化的参数你给我标记出来吧
但对于客户端是不认识这个对象的也是无法转输时,因此我们可以将List<Emp>转换为JSON或XML格式,这就是一种序列化,当客户端收到这个string时,又将转换为对象集合时,叫反序列化。
所以我们给Emp类加[Serializable]特性时,就表示Emp类可以被序列化,只有可以被序列化的类才能可以被反序列化,但使用[Serializable]特性进行序列化,也只有.NET 才能反序列化,当然也可以根据.NET 的序列化算法,用Java编写一个反序列化方法,但这种方法就不合适了,因此跨平台的时候,我们通常用通用的序列化方法如Json或Xml等,也可能用开源跨平台的序列化工具如 Google Protobuf。
先是开发人员有需求,说我需要序列化反序列化啊,这是个常用功能,于是有人(只不过这个个恰好是微软)做了个工具类
然后需求又说,我这个类里的字段不想全放序列化里啊,这个要序列化那个属性不要。工具类作者说了,那你得传参数啊,直接放方法参数里太麻烦了,每次都要传一堆,干脆用属性标记出来吧,于是有了NonSerialized一干特性,不想序列化的参数你给我标记出来吧
这时这个工具类的作者发现他没法区分了:当他遇到一个类,所有字段都没标记NonSerialized,这个类的意思是所有字段都要序列化呢,还是这个类压根不知道序列化这回事呢?作者只好要求调用方用Serializable把要序列化的类标记出来
大概就是这样。
举个栗子,你在qq中发送一段文字加图片混合的信息给某人的时候,qq不会提供多个方法分别接收文字和图片,而是将这段内容信息赋值给一个对象,然后序列化这个对象为 byte[],然后对这个数组编码,加密,压缩,然后传输给另一个客户端。客户端收到加密,压缩,编码过后的字节流,也就是byte[] 后,解密,解压,反序列化得到信息对象,直接填充到ui界面。
首先要理解序列化和反序列化,概念性的就不说了,自己可以查查;
例:你开发一个程序,服务器用.NET开发,有一个返回的有员工的方法Emps(),你的客户端可能是用.NET开发的WinFrom、WinWeb、或者手机(Android、IOS、Windows Mobile)、或者Linux等,你如何定义Emps()方法返回的数据格式才能确保任何客户端都能解析并展示数据呢?因为Emps()的调用过程可能是一个List<Emp>对象(如下),
1
2
3
4
5
6
7
|
Public
string
Emps()
{
EmpManager emp =
new
EmpManager();
List<Emp> empInfos = emp.GetInfos();
//仅是例子,.NET 没有对应的类或方法
return
Json.Serialized(empInfos);
}
|
但对于客户端是不认识这个对象的也是无法转输时,因此我们可以将List<Emp>转换为JSON或XML格式,这就是一种序列化,当客户端收到这个string时,又将转换为对象集合时,叫反序列化。
所以我们给Emp类加[Serializable]特性时,就表示Emp类可以被序列化,只有可以被序列化的类才能可以被反序列化,但使用[Serializable]特性进行序列化,也只有.NET 才能反序列化,当然也可以根据.NET 的序列化算法,用Java编写一个反序列化方法,但这种方法就不合适了,因此跨平台的时候,我们通常用通用的序列化方法如Json或Xml等,也可能用开源跨平台的序列化工具如 Google Protobuf。