代码之家  ›  专栏  ›  技术社区  ›  Andomar

将C类序列化为XML文本的简单方法

  •  8
  • Andomar  · 技术社区  · 15 年前

    在试图回答另一个问题时,我正在将C对象序列化为XML字符串。这非常困难;这是我能想到的最短的代码片段:

    var yourList = new List<int>() { 1, 2, 3 };
    var ms = new MemoryStream();
    var xtw = new XmlTextWriter(ms, Encoding.UTF8);
    var xs = new XmlSerializer(yourList.GetType());
    xs.Serialize(xtw, yourList);
    var encoding = new UTF8Encoding();
    string xmlEncodedList = encoding.GetString(ms.GetBuffer());
    

    结果还可以:

    <?xml version="1.0" encoding="utf-8"?>
    <ArrayOfInt
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <int>1</int>
        <int>2</int>
        <int>3</int>
    </ArrayOfInt>
    

    但这个片段比我想象的要复杂得多。我不敢相信你必须知道这个简单任务的编码和内存流。

    是否有更短的方法将对象序列化为XML字符串?

    3 回复  |  直到 11 年前
        1
  •  19
  •   johnc    11 年前

    稍微短一点:—)

    var yourList = new List<int>() { 1, 2, 3 };
    using (var writer = new StringWriter())
    {
        new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
        var xmlEncodedList = writer.GetStringBuilder().ToString();
    }
    

    尽管之前的方法有一个缺陷,但值得指出。它将生成一个 utf-16 我们使用的标题 StringWriter 所以它并不完全等同于您的代码。得到 utf-8 标题我们应该使用 MemoryStream 和一个 XmlWriter 这是附加代码行:

    var yourList = new List<int>() { 1, 2, 3 };
    using (var stream = new MemoryStream())
    {
        using (var writer = XmlWriter.Create(stream))
        {
            new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
            var xmlEncodedList = Encoding.UTF8.GetString(stream.ToArray());
        }
    }
    
        2
  •  0
  •   Uwe Keim Tomasz    15 年前

    编写一个扩展方法或包装类/函数来封装代码段。

        3
  •  0
  •   Thomas Levesque    15 年前

    你不需要 MemoryStream 只要使用 StringWriter :

    var yourList = new List<int>() { 1, 2, 3 };
    using (StringWriter sw = new StringWriter())
    {
        var xs = new XmlSerializer(yourList.GetType());
        xs.Serialize(sw, yourList);
        string xmlEncodedList = sw.ToString();
    }