【发布时间】:2026-02-04 12:15:01
【问题描述】:
我需要编写一个 XML 片段以供 Web 服务使用。任何 xml 声明都会导致 Web 服务拒绝请求。为了支持这一点,我有以下课程:
public class ContentQueryCriteria
{
public int Type { get; set; }
public string Value { get; set; }
public int Condition { get; set; }
}
这让我可以设置请求标准,然后得到结果。
代码是这样使用的:
ContentQueryCriteria content = new ContentQueryCriteria();
content.Type = 1;
content.Value = "NAVS500";
content.Condition = 1;
string requestBody = SerializeToString(content);
Console.WriteLine(requestBody);
当我将它序列化为 XML 文件时,我得到了正确的响应,没有 XML 声明或任何命名空间。但是,我宁愿在内存流中捕获数据,而不是在文件中。
使用以下方法(取自http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks)我能够取得结果,但由于某种原因我有一个?列为字符串的一部分。
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = Encoding.Unicode;
XmlWriter writer = XmlWriter.Create(ms, settings);
serializer.Serialize(writer, obj, ns);
return Encoding.Unicode.GetString(ms.ToArray());
}
结果字符串是:
?<ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>
如果我设置 OmitXmlDeclaration = false 我得到以下字符串:
?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>
谁能帮我确定为什么额外的?有吗?我怎样才能删除它?
没有 BOM 的工作 SerializeToString 方法
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = new UnicodeEncoding(bigEndian: false, byteOrderMark: false);
XmlWriter writer = XmlWriter.Create(ms, settings);
serializer.Serialize(writer, obj, ns);
return Encoding.Unicode.GetString(ms.ToArray());
}
【问题讨论】:
-
有趣的是,XML 声明的一部分似乎被留在了其中,或者是编码问题 - 您是否出于好奇尝试过任何其他编码?
-
我也是这么想的,但我尝试了 UTF8 和 unicode 的编码,结果相同。
-
如果您将 OmitXmlDeclaration 更改为 false 是否有效(当然您获得了 XML 声明,但它输出的 XML 是否正常?)
-
odd... 字符串返回为:?
1 NAVS500 1 -
所以它看起来与流有关 - 您是否检查了 MemoryStream 以查看写入后的第一个字节是什么?至少你可以消除编码
标签: c# xml-serialization