序列化(serialization)就是把对象的当前状态(字段及其值)转换数据流,可以把得到的数据流存放到文件、数据库、内存或其它地方;然后在我们需要时,使用反序列化(deserialization)将对象恢复。在.Net中,要序列化一个对象,可以使用属性将类的元素标为可序列化的(Serializable)和不可被序列化的(NonSerialized)。通过SoapFormatter(基于XML)和BinaryFormatter可以得到不同的数据流格式。

一、可序列化(Serializable)和不可序列化(NonSerialized)属性
    如果允许一个类序列化,需要在类上标记[Serializeble]属性

.NET 中的序列化[Serializable] //通过标记该属性,说明此类可以被序列化
.NET 中的序列化
public class User
}

    如果一个可序列化的类包含了对另一个类的引用,那么被引用的类也必须支持序列化

.NET 中的序列化[Serializable] //通过标记该属性,说明此类可以被序列化
.NET 中的序列化
public class User
}

 

 二、SoapFormatter和BinaryFormatter
    下面的代码分别使用SoapFormatter和BinaryFormatter将User类序列化到文件中:

.NET 中的序列化namespace SerializApp
}

使用SoapFormatter得到的数据流(Soap_user.txt):

.NET 中的序列化<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
.NET 中的序列化
<SOAP-ENV:Body>
.NET 中的序列化
<a1:User id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SerializApp/SerializApp%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
.NET 中的序列化
<id>1001</id>
.NET 中的序列化
<name id="ref-3">netflu</name>
.NET 中的序列化
</a1:User>
.NET 中的序列化
</SOAP-ENV:Body>
.NET 中的序列化
</SOAP-ENV:Envelope>

使用BinaryFormatter得到的数据流(Binary_user.dat):

.NET 中的序列化               BSerializApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   SerializApp.User   idname    ?     netflu

通过对SoapFormatter和BinaryFormatter输出的数据流进行观察,可以发现他们各有优缺点,Soap的可读性高,而Binary的数据量小。


三、自定义序列化
    如果要精确控制对象的序列化,需要实现ISerializable接口

.NET 中的序列化//ISerializable接口原型
.NET 中的序列化
public interface ISerializable
    }

    以下是一个实现了ISerializable接口的类:

.NET 中的序列化    [Serializable]
.NET 中的序列化    
public class User : ISerializable
    }

主要通过SerializationInfo对象提供的AddValue方法通过键值对来保存一个值,然后通过一系列GetValue方法来取出值。




 

相关文章:

  • 2021-08-06
  • 2021-07-21
  • 2022-12-23
  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-19
猜你喜欢
  • 2021-10-13
  • 2022-01-26
  • 2022-01-15
  • 2021-12-01
  • 2022-03-06
相关资源
相似解决方案