【问题标题】:Custom Serialization using XmlSerializer使用 XmlSerializer 自定义序列化
【发布时间】:2010-12-31 05:25:38
【问题描述】:

我有一个类,我需要从中执行一些自定义 XML 输出,因此我实现了 IXmlSerializable 接口。但是,除了我想更改 xml 标记名称之外,我想使用默认序列化输出一些字段。当我调用 serializer.Serialize 时,我会在 XML 中获得默认标记名称。我可以以某种方式更改这些吗?

这是我的代码:

public class myClass: IXmlSerializable
{
    //Some fields here that I do the custom serializing on
    ...

    // These fields I want the default serialization on except for tag names
    public string[] BatchId { get; set; }
    ...

    ... ReadXml and GetSchema methods are here ...

    public void WriteXml(XmlWriter writer)
    {                        
        XmlSerializer serializer = new XmlSerializer(typeof(string[]));
        serializer.Serialize(writer, BatchId);
        ... same for the other fields ...

        // This method does my custom xml stuff
        writeCustomXml(writer);   
    }

    // My custom xml method is here and works fine
    ...
}

这是我的 Xml 输出:

  <MyClass>
    <ArrayOfString>
      <string>2643-15-17</string>
      <string>2642-15-17</string>
      ...
    </ArrayOfString>
    ... My custom Xml that is correct ..
  </MyClass>

我想结束的是:

  <MyClass>
    <BatchId>
      <id>2643-15-17</id>
      <id>2642-15-17</id>
      ...
    </BatchId>
    ... My custom Xml that is correct ..
  </MyClass>

【问题讨论】:

  • 你多久序列化/反序列化?在应用程序生命周期内或仅在启动/关闭时 100 次。如果是前者,我有一个更加灵活的实现。
  • 真的只序列化一次。此应用程序是一个简单的工具,可以从专有数据库格式中提取数据并保存为 xml。所以我将数据拉入对象模型,然后立即序列化。大部分数据都很简单,所以我不需要实现 IXmlSerializable ......但是这个特定的数据片段有点痛苦。
  • 看看这里,代码是 MIT code.google.com/p/videobrowser/source/browse/MediaBrowser/… 还有一个单元测试,你可能需要扩展一点,但是所有的架构都在那里。加上你的场景,它会比 XmlSerializer 执行得更好

标签: c# .net-3.5 xml-serialization ixmlserializable


【解决方案1】:

在许多情况下,您可以使用接受 XmlAttributeOverridesXmlSerializer 构造函数重载来指定此额外的名称信息(例如,传递新的 XmlRootAttribute) - 但是,这不适用于数组据我所知。对于string[] 示例,我希望手动编写它会更简单。在大多数情况下,IXmlSerializable 是很多额外的工作——出于这样的原因,我尽可能避免它。对不起。

【讨论】:

  • XmlSerializer 是一项旧的无人维护、效率低下的技术,MS 很久以前就应该弃用它,或者至少重新实现。我只是遇到了麻烦。最好使用协议缓冲区:p
  • 看看我是否可以将 pb-net 的输出转换为 xml 是多么诱人;-p
  • 你应该完全做到这一点,并使其可插入,以便人们可以实现自己的持久性格式,然后你甚至可以使用 sqlite 作为数据存储......
【解决方案2】:

您可以使用control the serialized XML 的属性标记您的字段。例如,添加以下属性:

[XmlArray("BatchId")]
[XmlArrayItem("id")]
public string[] BatchId { get; set; }

可能会让你到达那里。

【讨论】:

    【解决方案3】:

    如果有人还在寻找这个,你绝对可以使用 XmlArrayItem 但是这需要是类中的一个属性。

    为了便于阅读,您应该使用同一个单词的复数和单数。

        /// <summary>
        /// Gets or sets the groups to which the computer is a member.
        /// </summary>
        [XmlArrayItem("Group")]
        public SerializableStringCollection Groups
        {
            get { return _Groups; }
            set { _Groups = value; }
        }
        private SerializableStringCollection _Groups = new SerializableStringCollection();
    
    
    
    <Groups>
       <Group>Test</Group>
       <Group>Test2</Group>
    </Groups>
    

    大卫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多