【问题标题】:XML Deserialize with UTF-8 encoding使用 UTF-8 编码的 XML 反序列化
【发布时间】:2013-02-25 17:27:45
【问题描述】:

我今天已经对此进行了很多搜索,但找不到如何使用 UTF-8 编码进行反序列化。

 <?xml version="1.0" encoding="UTF-8"?>
 <AvailabilityRequestV2 xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
 siteid="0000"
 apikey="0000"
 async="false" waittime="0">
 <Type>4</Type>
 <Id>159266</Id>
 <Radius>0</Radius>
 <Latitude>0</Latitude>
 <Longitude>0</Longitude>
 </AvailabilityRequestV2>

如果我试试这个

 string xmlString = File above;         
 XmlSerializer serializer = new XmlSerializer(typeof(AvailabilityRequestV2));
 AvailabilityRequestV2 request = (AvailabilityRequestV2)serializer.Deserialize(
     new MemoryStream(Encoding.UTF8.GetBytes(xmlString)));

如果我将鼠标悬停在调试模式下,我会得到:

     {<?xml version="1.0" encoding="utf-16"?><AvailabilityRequestV2 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      ..................

如何强制成为 UTF-8?

我只看到序列化,但我没有反序列化。

【问题讨论】:

    标签: c# serialization utf-8 xml-serialization


    【解决方案1】:

    您可以使用 StreamReader 并指定 UTF-8,也可以告诉它使用 BOM(如果存在):

    using (StreamReader reader = new StreamReader("my.xml",Encoding.UTF8,true)) {
        XmlSerializer serializer = new XmlSerializer(typeof(SomeType));
    
        object result = serializer.Deserialize(reader);
    }
    

    我不确定当 XML 阅读器在 XML 中遇到 encoding="utf-16" 指令时会发生什么,它可能会切换。

    【讨论】:

      【解决方案2】:

      一旦您将文件的内容转换为 .Net/CLR 字符串,它就会采用 UTF-16 编码:它已从其原始源编码转换。 CLR 在内部使用 UTF-16,因此 char 是 16 位的原因。

      因此,文档的 [原始] XML 声明中指定的编码现在与文档的实际编码不一致。

      最好按照上面@Lloyd 的建议通过StreamReader

      【讨论】:

        【解决方案3】:

        我认为@Lloyd 的示例需要new 关键字:

        using (StreamReader reader = new StreamReader("my.xml",Encoding.UTF8,true)) {
        

        【讨论】:

          猜你喜欢
          • 2017-06-18
          • 1970-01-01
          • 2012-11-07
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          • 1970-01-01
          • 2011-05-09
          • 2011-03-16
          相关资源
          最近更新 更多