65.9K
CodeProject 正在变化。 阅读更多。
Home

Bob 自定义 XML 序列化器

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2007年2月25日

CPOL

2分钟阅读

viewsIcon

42886

downloadIcon

237

使用 .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) 提供给项目。

谢谢!

© . All rights reserved.