将类结构序列化为 XML 似乎添加了一个 NewLine 字符

Posted

技术标签:

【中文标题】将类结构序列化为 XML 似乎添加了一个 NewLine 字符【英文标题】:Serializing class structure to XML seems to add a NewLine character 【发布时间】:2021-09-07 08:24:55 【问题描述】:

下面的代码将 XML 序列化为一个字符串,然后将其写入一个 XML 文件(是的,在 UTF8 和命名空间的删除方面发生了很多事情):

var bidsXml = string.Empty;

var emptyNamespaces = new XmlSerializerNamespaces(new[]  XmlQualifiedName.Empty );

var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;

activity = $"Serialize Class INFO to XML to string";
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))

  XmlSerializer xml = new XmlSerializer(info.GetType());

  xml.Serialize(writer, info, emptyNamespaces);

  bidsXml = Encoding.UTF8.GetString(stream.ToArray());


var lastChar = bidsXml.Substring(bidsXml.Length);

var fileName = $"CostOffer_Testing_DateTime.Now:yyyy.MM.dd_HH.mm.ss.xml";

var path = $"c:\\temp\\pjm\\fileName";
File.WriteAllText(path, bidsXml);

问题是,对 XML 的序列化似乎引入了 CR/LF (NewLine):

在 XML 文件中更容易看到:

一种解决方法是去掉“最后一个”字符:

bidsXml = bidsXml.Substring(0,bidsXml.Length - 1);

但更好的是了解根本原因并在没有解决方法的情况下解决 - 知道为什么将这个 NewLine 字符附加到 XML 字符串吗?

** 编辑 **

我能够尝试加载到消费者应用程序中(在此尝试之前,我使用 API 来导入 XML),并且收到了一条更有说服力的消息:

你加载的文件是二进制文件,这里不能显示内容。

所以我怀疑无法打印的字符以某种方式嵌入到文件/XML 中。当我在 Notepad++ 中打开文件时,我看到以下内容(UFF-8-Byte Order Mark)——至少我还有一些事情要做:

【问题讨论】:

有什么问题?空白在 XML 中通常不重要。 我从我的 XML 消费者那里收到的反馈相当于“您的 XML 错误”——我没有得到关于它为什么错误的反馈。因此,我正在努力使我的 XML 尽可能干净,以尽我所能消除任何问题。 撇开用尾随换行符终止 XML 是否正确,我无法重现您所看到的行为。当我复制您的代码信息时,最后一个字符是'>',unicode value = 003E。见dotnetfiddle.net/KAezsf。 如果您不想在文件开头使用BOM,请使用new UTF8Encoding(false)。见:Force no BOM when saving XML。或者我相信如果您使用Xmlserializer.Serialize(Stream, Object, XmlSerializerNamespaces),则不包括 BOM。 顺便说一句,var lastChar = bidsXml.Substring(bidsXml.Length); 不是获取字符串中最后一个字符的正确方法。 c# 字符串是零索引的,所以最后一个字符由 bidsXml[bidsXml.Length - 1] 给出,包含最后一个字符的字符串是 bidsXml.Substring(bidsXml.Length-1)bidsXml.Substring(bidsXml.Length) 只是一个零长度的空字符串。 【参考方案1】:

因此,我的 XML 的使用者似乎不希望流中的 BOM(字节顺序标记)。

访问本站UTF-8 BOM adventures in C#

我已更新我的代码以使用 new UTF8Encoding(false)) 而不是 Encoding.UTF8

var utf8NoBOM = new UTF8Encoding(false);

var bidsXml = string.Empty;

var emptyNamespaces = new XmlSerializerNamespaces(new[]  XmlQualifiedName.Empty );

var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;

activity = $"Serialize Class INFO to XML to string";
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream, utf8NoBOM))

  XmlSerializer xml = new XmlSerializer(info.GetType());

  xml.Serialize(writer, info, emptyNamespaces);

  bidsXml = utf8NoBOM.GetString(stream.ToArray());



var fileName = $"CostOffer_Testing_DateTime.Now:yyyy.MM.dd_HH.mm.ss.xml";

var path = $"c:\\temp\\pjm\\fileName";
File.WriteAllText(path, bidsXml, utf8NoBOM);

【讨论】:

And.... 解决了换行符的问题?如果不是,那么这并不是问题的真正答案,BOM 似乎是巧合。 @HereticMonkey - 不清楚是否有换行符开始,尚未复制。 @dbc 听起来这个问题应该被关闭为不可重现然后......

以上是关于将类结构序列化为 XML 似乎添加了一个 NewLine 字符的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF 将类序列化为 xsd.exe 生成的 JSON

将类序列化为XML并包括CDATA节的问题

将类序列化为 .json 文件

您可以将旧版本的 xml 反序列化为更新的结构吗

将类序列化为单个无属性元素,其内容设置为一个属性

Python将类序列化为JSON [重复]