Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlWriterSettings和XmlSerializer编写XML片段会增加一个字符_C#_Xml Serialization - Fatal编程技术网

C# 使用XmlWriterSettings和XmlSerializer编写XML片段会增加一个字符

C# 使用XmlWriterSettings和XmlSerializer编写XML片段会增加一个字符,c#,xml-serialization,C#,Xml Serialization,我需要编写一个XML片段供web服务使用。任何xml声明都会导致web服务拒绝请求。为了支持这一点,我有以下课程: public class ContentQueryCriteria { public int Type { get; set; } public string Value { get; set; } public int Condition { get; set; } } 这允许我设置请求标准,然后获得结果 代码的使用方式如下: ContentQueryC

我需要编写一个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声明或任何名称空间。然而,我宁愿将数据捕获到内存流中,而不是文件中

使用以下方法(摘自)我能够获得结果,但出于某种原因,我有一个?作为字符串的一部分列出

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>
您将BOM(字节顺序掩码)视为从流的字节数组转换而来的字符串中的第一个字符

关闭输出BOM表,您会没事的

使用不生成BOM表的编码对象:


有趣的是,XML声明的一部分似乎被遗漏了,或者是因为编码问题——出于好奇,您尝试过其他编码吗?我也是这么想的,但我尝试了UTF8和unicode两种编码,结果相同。如果将OmitXmlDeclaration更改为false,是否有效(当然,您得到了XML声明,但它输出的是ok XML吗?)奇怪的…字符串返回为:?1NAVS5001那么它看起来与流有关-您是否检查了MemoryStream以查看写入后的第一个字节是什么?至少您可以消除编码
?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>
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());


}
settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)