使用。净什么限制(如果有的话)是有用的序列化程序?例如,你可以列化图像,以XML?

有帮助吗?

解决方案

XmlSerializer有一些缺点。

  1. 必须知道所有被序列化的类型。您不能通过表示序列化程序不知道的类型的接口传递它。
  2. 它不能做循环引用。
  3. 如果在对象图中多次引用,它将多次序列化同一个对象。
  4. 无法处理私有字段序列化。
  5. 我(愚蠢地)编写了我自己的序列化程序来解决其中的一些问题。不要那样做;这是一项很多工作,你会在几个月后发现微妙的错误。我在编写自己的序列化器和格式化程序时获得的唯一一点是对对象图序列化中涉及的细节的更大理解。

    我在WCF时找到了 NetDataContractSerializer 出来。它完成了XmlSerializer不能完成的所有内容。它以与XmlSerializer类似的方式驱动序列化。一个用属性修饰各种属性或字段,以通知序列化程序要序列化的内容。我替换了我用NetDataContractSerializer编写的自定义序列化程序,并对结果非常满意。我强烈推荐它。

其他提示

我一般地找到序列化程序是一个贫穷的选择,对于任何POCO,不仅仅是一个也可与检.如果你需要特定的XML,你可以去Xml*属性和/或IXmlSerializable的路线-但你留下的一个目漂亮的损坏。

对于某些目的而言,这仍然是一个显而易见的选择-即使有它的局限性。但是,对于简单地储存和重新装载数据,我发现BinaryFormatter要容易得多的选择,以较少的陷阱。

这里有一个列表中的一些烦恼有序列化程序-多数我已经咬了一点或另一种,其他人我发现在 MSDN:

  • 需要一个公开的,没有args构造
  • 只有将公共阅读写特性和领域
  • 要求所有类型已知的
  • 实际上调入get_*和set_*,所以验证,等等。将运行。这可能是好的或坏的(思考了电话,以及)
  • 将唯一列化类型或ICollection集符合特定规则

的序列化程序给予特殊治疗课,实施类型或ICollection.一级实现综合必须实现一个公共增加方法,需要一个单一的参数。添加的方法的参数必须是相同的类型是从当前财产的价值返回GetEnumerator,或其中一个这种类型的基础。

一个类实现ICollection(例如CollectionBase)除了综合必须有一个公共项目编制索引的财产(indexer在C#),需要一个整数,它必须有一个公共数酒店的类型整数。的参数,以增加方法必须是相同的类型作为返回项目的财产,或其中一个这种类型的基础。类实现ICollection、价值观被列化的检索索引项目的财产,不通过调用GetEnumerator.

  • 不serialize IDictionary
  • 使用动态生成的组件,而这可能不会得到卸载应用领域。

增加绩效,XML化基础设施动态生成的组件化和deserialize指定的类型。基础设施的发现和利用这些组件。这种行为发生,只有当使用以下构造:

序列化程序.序列化程序(类型) 序列化程序.序列化程序(类型、串)

如果您使用的任何其他的构造,多个版本同样会产生和从卸载,其结果在存储器泄漏和性能差。

  • 不serialize。[]或列表<T>[]
  • 还有其他奇怪的边缘情况

的序列化程序无法实例,以列化枚举,如果满足以下条件:所列举的类型是unsigned long(无符长在C#)和列举含有任何构件,价值大于9,223,372,036,854,775,807.

的序列化程序类不再将目标作为[废弃].

你必须有权编写的临时目录(规定的临时环境变量),以deserialize一个对象。

  • 需要阅读。InnerException得到任何有用的信息错误

另一个问题是调用XmlSerializer的构造函数将在运行时编译代码并生成一个临时DLL(在%temp%文件夹中),其中包含执行de / serialization的代码。

如果将以下行添加到app.config,则可以查看代码:

  <system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="4"/>
    </switches>
  </system.diagnostics>

第一次序列化类需要花费大量时间,并且需要具有编译和写入磁盘权限的代码。

解决这个问题的方法是使用VS 2005+附带的sGen.exe工具预编译这些DLL。

在此处查看更多信息

不确定是否有任何限制..但是在.NET 1.1中的XmlSerialization中存在内存泄漏错误,你必须创建一个缓存序列化器对象来解决这个问题...事实上,我不确定如果此问题已在.net 2.0或更新版本中修复...

你写的任何课程理论上都可以通过XmlSerializer提供。然而,它只能访问公共字段,并且需要使用正确的属性(例如XmlAttribute)标记类。即使在基本框架中,并非所有东西都支持XmlSerializer。 System.Collections.Generic.Dictionary LT <!>; <!> GT;例如。

我能想到的一个限制是XmlSerialization是选择退出;意味着您不希望序列化的类的任何属性必须使用[XmlIgnore]进行修饰。与DataContractSerializer对比,其中所有属性都是选择加入,您必须显式声明包含属性。这是一个很好的写了

XmlSerializer将图像或其二进制数组序列化为base64编码文本。

例如,您无法序列化实现IDictionary接口的类。

对于集合,他们需要使用一个参数的Add方法。如果您只需要文本格式而不是特定的xml,则可以尝试使用JSON。我已经为.NET开发了一个, JsonExSerializer ,还有其他一些可用于 http://www.json.org

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top