将类结构序列化为 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 字符的主要内容,如果未能解决你的问题,请参考以下文章