如何在C#中自定义List<string>的序列化

3
这真让我头疼。我已经阅读了以下内容:http://msdn.microsoft.com/en-us/library/athddy89(v=VS.80).aspxhttp://msdn.microsoft.com/en-us/library/2baksw0z(v=VS.80).aspx,但我不知道如何将其应用到我正在尝试做的事情上。我想自定义以下列表序列化的方式...
[Serializable]
public class FinalConcentrations : List<string> { }

这样当我将其作为“objectToSerialze”传递给这个函数时...

    public void serializeObject(object objectToSerialize, Stream outputStream)
    {
        // removes the default added namespaces
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");

        XmlSerializer serial = new XmlSerializer(objectToSerialize.GetType());
        MemoryStream ms = new MemoryStream();
        serial.Serialize(ms, objectToSerialize, ns);

        StreamReader reader = new StreamReader(ms);
        ms.Position = 0;

        ms.WriteTo(outputStream);
    }

...它将此写入输出流:

<FinalConcentrations>
   <FinalConcentration>string value 1</FinalConcentration>
   <FinalConcentration>string value 2</FinalConcentration>
   <FinalConcentration>string value 3</FinalConcentration>
</FinalConcentration>

...使用这个而不是那个

<FinalConcentrations>
   <string>string value 1</string>
   <string>string value 2</string>
   <string>string value 3</string>
</FinalConcentration>

我的serializeObject方法用于序列化各种对象,因此我正在寻找一种在FinalConcentrations定义中完成这个任务而不是在该方法内部完成的方法。
请帮忙。
2个回答

1
最简单的方法是传递一个包装对象而不是列表本身,例如:
public class FinalConcentrations {
    private readonly List<string> items = new List<string>();
    [XmlElement("FinalConcentration")]
    public List<string> Items {get {return items;}}
}

那是做什么的?


谢谢!我需要能够从类外部修改列表,所以我将items属性设置为可读/写,但这正是解决问题的关键。现在它可以正确地序列化了。 - Marvin
@Marvin - 修改列表的惯用方式通常是使用 Add/Remove/Clear 等方法。你不需要使用 set - Marc Gravell

0

好的,当我运行您的示例时,实际上我得到了

<?xml version="1.0"?>
<ArrayOfString>
  <string>Red</string>
  <string>Green</string>
  <string>Blue</string>
</ArrayOfString>

但是通过更改

  [Serializable, XmlRoot( ElementName= "FinalConcentrations")]
  public class FinalConcentrations : List<string> { }

我得到了

<?xml version="1.0"?>
<FinalConcentrations>
  <string>Red</string>
  <string>Green</string>
  <string>Blue</string>
</FinalConcentrations>

证毕?

有很多XML装饰属性可以改变序列化方式,例如XmlElement。值得一看。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接