关于序列化

Serializable不是.net的核心概念

先是开发人员有需求,说我需要序列化反序列化啊,这是个常用功能,于是有人(只不过这个个恰好是微软)做了个工具类

然后需求又说,我这个类里的字段不想全放序列化里啊,这个要序列化那个属性不要。工具类作者说了,那你得传参数啊,直接放方法参数里太麻烦了,每次都要传一堆,干脆用属性标记出来吧,于是有了NonSerialized一干特性,不想序列化的参数你给我标记出来吧

这时这个工具类的作者发现他没法区分了:当他遇到一个类,所有字段都没标记NonSerialized,这个类的意思是所有字段都要序列化呢,还是这个类压根不知道序列化这回事呢?作者只好要求调用方用Serializable把要序列化的类标记出来

大概就是这样。



举个栗子,你在qq中发送一段文字加图片混合的信息给某人的时候,qq不会提供多个方法分别接收文字和图片,而是将这段内容信息赋值给一个对象,然后序列化这个对象为 byte[],然后对这个数组编码,加密,压缩,然后传输给另一个客户端。客户端收到加密,压缩,编码过后的字节流,也就是byte[] 后,解密,解压,反序列化得到信息对象,直接填充到ui界面。



首先要理解序列化和反序列化,概念性的就不说了,自己可以查查;
例:你开发一个程序,服务器用.NET开发,有一个返回的有员工的方法Emps(),你的客户端可能是用.NET开发的WinFrom、WinWeb、或者手机(Android、IOS、Windows Mobile)、或者Linux等,你如何定义Emps()方法返回的数据格式才能确保任何客户端都能解析并展示数据呢?因为Emps()的调用过程可能是一个List<Emp>对象(如下),
 

C# code
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值