Bob 自定义 XML 序列化器





4.00/5 (3投票s)
使用 .NET 的自定义 XML 序列化器。
引言
您是否曾经想过拥有一个可以编程为序列化对象中某些字段的 XML 序列化器? 想象一下这样一种情况:您想要序列化一个带有密码字段的对象,并且该字段应该使用同一对象中的另一个密钥字段进行加密。 这意味着,在序列化之前进行一些自定义处理。 如果您应该以 XML 格式序列化对象的私有字段,或者为 XML 标签设置自定义名称怎么办?
解决方案
这个想法是为要序列化的对象实现一个接口,该接口具有一个在序列化和反序列化过程中调用的方法。 参与序列化过程的对象应该实现以下接口
public interface IXMLTransferable
{
void Transformer IXMLTransformer( xmlTransformer );
}
在上面的 Transformer
方法中,使用在序列化时传递给该方法的 xmlTransformer
变量,并使用 AddField
方法指定参与序列化的字段。 例如
class BeSerializedClass : IXMLTransferable
{
private int xVar;
private BeSerializedClass _recursive_composition;
public int XVar {
get { return xVar; }
set { xVar = value; }
}
public Recursive_Class Recursive_Class_Object
{
get { return _recursive_composition; }
set { _recursive_composition = value; }
}
#region IXMLTransferable Transformer Member
public void Transformer(IXMLTransformer xmlTransformer)
{
xmlTransformer.AddField<int>("xVar", ref xVar);
xmlTransformer.AddField<BeSerializedClass>("_recursive_composition", ref
_recursive_composition);
}
#endregion
}
在序列化时,使用 xmlTransformerFactory
类的实例将对象序列化/反序列化为/从 XML 字符串。
BeSerializedClass recursive_Class = new BeSerializedClass();
// Serialize BeSerializedClass into XML
XMLTransformerFactory xmlTransformerFactory =
XMLTransformerFactory.CreateInstance();
string serializedXml = xmlTransformerFactory.ToXml(recursive_Class);
// Deserialize subjectClass from XML
Recursive_Class subjectClass_Deserialized =
xmlTransformerFactory.FromXml<Recursive_Class> (serializedXml);
当对象被序列化 (ToXml
) 和反序列化 (FromXml
) 时,IXMLTransferable
接口的 Transformer
方法会被调用。
设计
有一个名为 XMLTransformerFactory
的工厂对象来序列化/反序列化 IXMLTransferable
对象,该工厂创建一个 SerializerXMLTransformer
对象来序列化对象,并创建一个 DeserializerXMLTransformer
对象来反序列化对象。 这两个类都是 AbstractXMLTransformer
类的类型,该类实现了 IXMLTransformer
接口。 当 IXMLTransferable
对象被序列化时,它的 Transformer
方法会被调用,传递 IXMLTransformer
Serializer 对象作为其变量,以将类的字段添加到 XML 文件中。
internal abstract class AbstractXMLTransformer : IXMLTransformer
internal class SerializerXMLTransformer : AbstractXMLTransformer
internal class DeserializerXMLTransformer : AbstractXMLTransformer
实现
XML 序列化器的代码位于名为 BOB.XMLSerializer 的库 (DLL) 中。 提供了各种基于场景的单元测试作为示例。
部署
需要 NUnit 才能运行测试 (BOB.XMLSerializer.Tests) 项目。 将 NUnit 的路径 (.\Program Files\NUnit-Net-2.0 2.2.8\bin\nunit-gui.exe) 提供给项目。
谢谢!