代码之家  ›  专栏  ›  技术社区  ›  fretje

XmlTextWriter序列化问题

  •  16
  • fretje  · 技术社区  · 17 年前

    MESSAGE .

    因此,在创建一个 并填充其所有属性,我将其序列化如下:

    serializer = new XmlSerializer(typeof(Xsd.MESSAGE));
    StringWriter sw = new StringWriter();
    serializer.Serialize(sw, response);
    string xml = sw.ToString();
    

    到目前为止,一切都很顺利,字符串xml包含有效的(UTF-16编码)xml。

    :忘记包含流的声明

    serializer = new XmlSerializer(typeof(Xsd.MESSAGE));
    using (MemoryStream stream = new MemoryStream())
    {
        XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);
        serializer.Serialize(xtw, response);
        string xml = Encoding.UTF8.GetString(stream.ToArray());
    }
    


    当我这样检查char时:

    char c = xml[0];
    

    我可以看到c的值是65279。
    有人知道这是从哪里来的吗?
    我可以通过删除第一个char来轻松解决这个问题:

    xml = xml.SubString(1);
    

    但我宁愿知道发生了什么,也不愿盲目地切割第一块焦炭。

    2 回复  |  直到 17 年前
        1
  •  17
  •   Chris W. Rea    17 年前

    这是修改后的代码,不添加字节顺序标记( BOM ):

    var serializer = new XmlSerializer(typeof(Xsd.MESSAGE));
    Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false);
    XmlTextWriter xtw = new XmlTextWriter(stream, utf8EncodingWithNoByteOrderMark);
    serializer.Serialize(xtw, response);
    string xml = Encoding.UTF8.GetString(stream.ToArray());
    
        2
  •  7
  •   Community Mohan Dere    9 年前

    BOM,您可以通过创建一个不使用BOM的UTF8Encoding实例来摆脱它。(有关详细信息,请参阅构造函数重载。)

    然而,有一种更简单的方法可以发布UTF-8。您可以使用 StringWriter ,但它是一个重写 Encoding 财产。看 this answer 举个例子。

    推荐文章