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

迷你 XML 序列化器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (5投票s)

2010年7月6日

CPOL

2分钟阅读

viewsIcon

26418

downloadIcon

223

一个用于 Silverlight 项目的小型 XML 序列化器。

引言

Silverlight 肯定是一个令人难以置信的框架,但在某些领域,它缺少所需的功能。在我的 Silverlight 之旅中,当我编写游戏时,我需要保存当前的游戏状态;但是,没有真正的解决方案可用,或者至少我没有找到任何解决方案。这种情况部分也是由于我自己的要求,例如保存事件并拥有完整的类层次结构,而无需像标准 XML 序列化在 .NET 上那样定义实现类的列表。

为了解决这个问题,我编写了自己的小型 XML 序列化器,它与 Silverlight 应用程序(以及 Silverlight 的限制)以及普通的 .NET 应用程序完全兼容。它将序列化任何实现 IMiniSerializable 接口的类和一些基本类型。它将序列化泛型列表和事件。循环引用被处理为指向已知对象的指针。最后,所有这些都是为了尽可能减少 XML 大小(以牺牲 XML 的可读性为代价)而完成的。

Using the Code

附加的 zip 文件包含序列化器类、接口以及如何使用它的示例。该项目是一个 .NET 2 控制台项目,但几乎可以在任何 .NET 2 或更高版本的项目中使用。

每个需要序列化的类(除了像 doubleint 等 .NET 类)必须实现接口 IMiniSerializable,该接口需要实现以下函数

void OnSerialize(MiniSerializer serializer);
void OnDeserialize(MiniSerializer serializer);

这些函数负责类本身的序列化。类属性和字段的属性标记不起作用,因为 Silverlight 无法访问类的 protectedprivate 成员(由于沙盒)。

一个典型的用法是

public void OnSerialize(MiniSerializer serializer)
{
    serializer.Serialize("name", this.name);
    serializer.Serialize("X", X);
    serializer.Serialize("listPointer", listPointer);
}

public void OnDeserialize(MiniSerializer serializer)
{
    name = (string)serializer.Deserialize("name");
    X = (double)serializer.Deserialize("X");
    listPointer = (DataList)serializer.Deserialize("listPointer");
}

最后,一旦你实现了对象树的所有类,你就可以通过类似以下的方式序列化根对象

MiniSerializer serializer = MiniSerializer.GetSerializer(
               new FileStream("test.xml", FileMode.Create));
serializer.Serialize("toto", t1);
serializer.Close();
serializer.DisposeStream();

MiniSerializer deserializer = MiniSerializer.GetDeserializer(
               new FileStream("test.xml", FileMode.Open));
DataList t = (DataList)deserializer.Deserialize("toto");
deserializer.Close();

关注点

这种“简单的”序列化让我措手不及,因为它非常复杂。主要问题是 Silverlight 支持有限;例如,缺少像我在 .NET 中使用的那样进行完整内省的能力。我完全理解原因,这是 Silverlight 应用程序的沙盒模型,但围绕它工作有点痛苦。

另一个让我完全措手不及的问题是事件的序列化和反序列化。同样,我在网上没有找到很多信息,而且我再次遇到了 Silverlight 的内省问题。但是,总的来说,我认为我制作了一个不错的、全面的小类,它应该可以完成大多数所需的工作,而不会在使用它时产生太多的开销。

最后,如果您真的想减少序列化数据的大小,您应该考虑压缩 XML。

© . All rights reserved.