正在阅读:C# 最强大的功能--泛型简介C# 最强大的功能--泛型简介

2005-06-23 10:16 出处: 作者:Juval Lowy 责任编辑:moningfeng

代码块 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);
}


键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品