代码块 13. 一般类型的客户端序列化
[Serializable] public class MyClass {...} MyClass obj1 = new MyClass();
IFormatter formatter = new BinaryFormatter();? Stream stream = new FileStream("obj.bin",FileMode.Create,FileAccess.ReadWrite); using(stream) { formatter.Serialize(stream,obj1); stream.Seek(0,SeekOrigin.Begin);
MyClass obj2; obj2 = (MyClass)formatter.Deserialize(stream); }
请注意,IFormatter 是基于对象的。您可以通过定义 IFormatter 的一般版本进行补偿:
public interface IGenericFormatter { T Deserialize(Stream serializationStream); void Serialize(Stream serializationStream,T graph); }
您可以通过包含一个基于对象的格式化程序来实现 IGenericFormatter:
public class GenericFormatter : IGenericFormatter where F : IFormatter,new() { IFormatter m_Formatter = new F(); public T Deserialize(Stream serializationStream) { return (T)m_Formatter.Deserialize(serializationStream); } public void Serialize(Stream serializationStream,T graph) { m_Formatter.Serialize(serializationStream,graph); } }
请注意一般类型参数 F 上的两个约束的用法。尽管可以原样使用 GenericFormatter:
using GenericBinaryFormatter = GenericFormatter; using GenericSoapFormatter2 = GenericFormatter;
但是,您还可以将该格式化程序强类型化以使用:
public sealed class GenericBinaryFormatter : GenericFormatter {} public sealed class GenericSoapFormatter : GenericFormatter {}
强类型化定义的优点是可以跨文件和程序集共享它,这与 using 别名相反。
代码块 14 与代码块 13 相同,唯一的不同之处在于它使用一般格式化程序:
代码块 14. 使用 IGenericFormatter
[Serializable] public class MyClass {...} MyClass obj1 = new MyClass();
IGenericFormatter formatter = new GenericBinaryFormatter();? Stream stream = new FileStream("obj.bin",FileMode.Create,FileAccess.ReadWrite); using(stream) { formatter.Serialize(stream,obj1); stream.Seek(0,SeekOrigin.Begin); MyClass obj2; obj2 = formatter.Deserialize(stream); }
|