gpt4 book ai didi

c# - 在 .NET 中将对象序列化为 UTF-8 XML

转载 作者:IT王子 更新时间:2023-10-29 03:35:46 27 4
gpt4 key购买 nike

为简洁起见,删除了适当的对象处理,但如果这是在内存中将对象编码为 UTF-8 的最简单方法,我会感到震惊。一定有更简单的方法,不是吗?

var serializer = new XmlSerializer(typeof(SomeSerializableObject));

var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);

serializer.Serialize(streamWriter, entry);

memoryStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(memoryStream, System.Text.Encoding.UTF8);
var utf8EncodedXml = streamReader.ReadToEnd();

最佳答案

不,您可以使用 StringWriter 来摆脱中间的 MemoryStream。但是,要将其强制转换为 XML,您需要使用覆盖 Encoding 属性的 StringWriter:

public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}

或者,如果您还没有使用 C# 6:

public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}

然后:

var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}

显然,您可以将 Utf8StringWriter 变成一个更通用的类,它在其构造函数中接受任何编码 - 但根据我的经验,UTF-8 是迄今为止 最常需要的“自定义”编码>StringWriter :)

现在正如 Jon Hanna 所说,这在内部仍然是 UTF-16,但大概你会在某个时候将它传递给其他东西,将它转换成二进制数据......在 that 点你可以使用上面的字符串,将它转换成 UTF-8 字节,一切都会很好 - 因为 XML 声明将指定“utf-8”作为编码。

编辑:一个简短但完整的例子来展示这个工作:

using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;

public class Test
{
public int X { get; set; }

static void Main()
{
Test t = new Test();
var serializer = new XmlSerializer(typeof(Test));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, t);
utf8 = writer.ToString();
}
Console.WriteLine(utf8);
}


public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
}

结果:

<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<X>0</X>
</Test>

注意声明的“utf-8”编码,我相信这是我们想要的。

关于c# - 在 .NET 中将对象序列化为 UTF-8 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com