【问题标题】:.NET Custom Xml Serialization.NET 自定义 Xml 序列化
【发布时间】:2010-02-19 18:51:39
【问题描述】:

我正在研究一些需要序列化/反序列化为 xml 的类,这些类可用于配置。这是我正在尝试做的一个示例

[Serializable]
public class MyConfig
{
    [XmlElement] 
    public string ConfigOption { get; set; }
    [XmlElement] 
    public Uri SomeUri { get; set; }
}

我想覆盖 Uri 属性被序列化的方式。所以当调用序列化方法时,我希望它看起来像这样

<MyConfig>
  <ConfigOption></ConfigOption>
  <SomeUri uri="" />
</MyConfig>

有没有办法插入 .net 序列化并覆盖所有 Uri 对象的序列化和反序列化方式?请注意,我不想创建一个名为 MyUri 的类并将其用作 SomeUri 的类型,我只想插入序列化序列化 Uri 类型的位置并覆盖该行为。

【问题讨论】:

标签: c# .net xml-serialization


【解决方案1】:
public class MyConfig
{
    [XmlElement] 
    public string ConfigOption { get; set; }
    [XmlElement] 
    public MyUri SomeUri { get; set; }
}

public class MyUri
{
    [XmlAttribute(Name="uri")]
    public Uri SomeUri { get; set; }
}

【讨论】:

  • 是的,这会起作用,但我不想创建另一个类来包装我需要以不同方式序列化/反序列化的任何对象。我想插入这个属性被序列化的地方,并控制它的外观。
  • 没有这样的地方。唯一的选择就是完全接管序列化。
  • 此外,如果您使用带有该代码的 XmlSerializer,它将无法正常工作,因为 Uri 没有默认构造函数,如果您想序列化 Uri 对象,则无法使用 XmlSerializer 对其进行序列化你必须实现 IXmlSerializable 然后在需要的地方接管。如果您想使用 XmlSerializer,将其作为字符串存储在公共可序列化属性中会更容易。
【解决方案2】:

由于您不想为 Uri 创建新的包装类,我认为您唯一的选择是 MyConfig 实现 IXmlSerializable 以便完全控制 XML 序列化过程。

但是,如果您这样做,您将有一个全有或全无的方法,因为您需要完全实现序列化,而不仅仅是Uriproperty。

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2015-01-31
    • 2019-04-08
    相关资源
    最近更新 更多