c# - 将对象序列化为字符串 : why is my encoding adding stupid characters?

标签 c# encoding xml-serialization

我需要获取对象的序列化 XML 表示形式作为字符串。我正在使用 XmlSerializer 和 memoryStream 来执行此操作。

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
using (MemoryStream stream = new MemoryStream())
{
  using (XmlTextWriter writer = new XmlTextWriter(stream,Encoding.UTF8))
  {
    serializer.Serialize(writer, myClass);
    string xml = Encoding.UTF8.GetString(stream.ToArray());
    //other chars may be added from the encoding.
    xml = xml.Substring(xml.IndexOf(Convert.ToChar(60)));
    xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1));
    return xml;
  }
}

现在只需注意一下 xml.substring 行。我发现的是(甚至认为我在 XmlTextWriter 和 GetString 上指定编码(并且我使用的是 memoryStream.ToArray(),所以我只对流缓冲区中的数据进行操作)。 .生成的 xml 字符串添加了一些非 xml 快乐字符。在我的例子中,字符串开头有一个 '?'。这就是为什么我要对 '<' 和 '>' 进行子字符串化以确保我'我们只得到好东西。

奇怪的是,在调试器(Text Visualizer)中查看这个字符串,我没有看到这个 '?'。仅当我将可视化工具中的内容粘贴到记事本或类似工具时。

所以当上面的代码(子字符串等)完成工作时,这里到底发生了什么?文本可视化工具中是否包含一些无符号字节但未表示?

最佳答案

您可以通过明确指定编码来排除 BOM - 即代替 Encoding.UTF8,尝试使用:

using (MemoryStream stream = new MemoryStream())
{
  var enc = new UTF8Encoding(false);
  using (XmlTextWriter writer = new XmlTextWriter(stream,enc))
  {
    serializer.Serialize(writer, myClass);        
  }
  string xml = Encoding.UTF8.GetString(
      stream.GetBuffer(), 0, (int)stream.Length);
}

关于c# - 将对象序列化为字符串 : why is my encoding adding stupid characters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923226/

相关文章:

c# - 使用 LINQ : XML to object? 时是否可以获得除 IEnumerable<T> 以外的其他集合

c# - 如何验证字符串是否为正则表达式?

c# - 单击一个对象

python - str.encode 期望输入什么?

c# - 如何使用 .NET 将 byte[] 转换为字符串以生成与 SQL Server Convert format 1 或 2 相同的字符串?

c# - typeof 和基类

encoding - sws_scale 在较小的 x264 mp4 编码中搞砸了最后一个像素行

C# XML 在 xml 标签后插入注释到 XML

.net - 如何在 .NET 中序列化此 Xml(数组)

c# - 如何让 xmlserializer 只序列化纯 xml?