繁体   English   中英

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

[英]Easier way to serialize C# class as XML text

在尝试回答另一个问题时,我将 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>

但是这个片段比我想象的更复杂。 我不敢相信您必须了解这个简单任务的编码和 MemoryStream。

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

短一点:-)

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();
}

尽管这种先前的方法存在一个值得指出的缺陷。 当我们使用StringWriter 时,它将生成一个utf-16标头,因此它不完全等同于您的代码。 要获得utf-8标头,我们应该使用MemoryStreamXmlWriter ,这是额外的一行代码:

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());
    }
}

简单地说,如果你想使用 UTF8 编码,那么就这样做

public class StringWriterUtf8 : System.IO.StringWriter
{
    public override Encoding Encoding
    {
        get
        {
            return Encoding.UTF8;
        }
    }

}

然后像这样使用 StringWriterUtf8 读取 StringWriter

        using (StringWriterUtf8 textWriter = new StringWriterUtf8())
        {

            serializer.Serialize(textWriter, tr, ns);

            xmlText = textWriter.ToString();
        }

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

您不需要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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM