解决DataContractSerializer编译时类型安全问题(未完)

解决DataContractSerializer编译时类型安全问题

DataContractSerializer的定义使用了无法判断类型的object对象(继承自XmlObjectSerializer的Object对象)。这意味着它不具备编译时类型安全,因为构造函数可以接收一种类型,而WriteObject()方法又会接收另一种类型,然后在ReadObject()方法中,又将它转换为第三种类型。
XmlObjectSerializer

public abstract class XmlObjectSerializer
{
public virtual object ReadObject(Stream stream);
public virtual object ReadObject(XmlReader reader);
public virtual void WriteObject(XmlWriter writer,object graph);
public void WriteObject(Stream stream,object graph);
//更多成员
}

方法一:定义泛型类DataContractSerializer<T>

P99页,由于有问题不能放入

NetDataContractSerializer—弥补DataContractSerializer的不足

NetDataContractSerializer,它是IFomatter接口的多态实现。因为实现了IFomatter接口,因而它与传统的.NET格式器相似,除了可以捕获对象状态,还包括类型信息。NetDataContractSerializer存在的目的是弥补DataContractSerializer的不足。我们可以使用NetDataContractSerializer序列化一个类型,然后使用DataContractSerialzier执行反序列化:

MyClass obj1 = new MyClass( );
Stream stream = new MemoryStream( );
IFormatter formatter1 = new NetDataContractSerializer( );
formatter1.Serialize(stream,obj1);
stream.Seek(0,SeekOrigin.Begin);
DataContractSerializer formatter2 = new DataContractSerializer(typeof(MyClass));
MyClass obj2 = (MyClass)formatter2.ReadObject(stream);
stream.Close( );

NetDataContractSerializer的这种特性有利于版本的兼容,同时也有利于将那些共享了类型信息的旧有代码,迁移到更加具有面向服务特征的程序中。这样,我们就只需要维持类型的数据样式。

猜你喜欢

转载自blog.csdn.net/Star_Inori/article/details/81088970