二进制序列化,常用情况就是把对象序列化为二进制字节流,用于对象状态持久化或网络传输。可能之前因为对序列化机制了解不够彻底,现在把它记录下来,作为备忘录。同时也希望对看到这篇文章的朋友有所启示和帮助。
二进制序列化类型BinaryFormatter,它存在于命名空间:System.Runtime.Serialization.Formatters.Binary;
而序列化的对象都必须被标识为:[Serializable()]。
- 序列化对象为二进制字节流
public static byte[] Serialize(Object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(ms, obj);
return ms.GetBuffer();
}
- 反序列化二进制字节流为对象
public static Object Deserialize(byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer);
BinaryFormatter binaryFormatter = new BinaryFormatter();
return binaryFormatter.Deserialize(ms); ;
}
如果我不想序列化某个字段或属性时。使用过序列化的人都知道使用[NoSerialized()]特性来标识。但是,[NoSerialized()]只用应用于字段域。例如,在.Net3.0之后属性的定义可以使用无字段域定义属性。如果该属性我不想被序列化的情况,那么就只能采用字段域来定义属性的返回值。
总而言之,我们看可以把二进制序列化视为只对字段域的序列化,对于无字段域的属性,可视为.net使用了隐藏的字段域,如果需要标识某个属性不应被序列化时,只能显示声明该属性的字段域了。