【问题标题】:XML Deserialization encoding issueXML反序列化编码问题
【发布时间】:2016-09-21 13:24:34
【问题描述】:

我已经搜索了很多,无法找到解决方案,无法确定正确的方法

我正在将一个对象序列化为 xml 字符串并使用 c# 将其反序列化回一个对象。序列化后的 XML 字符串添加一个前导 ?。当我将其反序列化回对象时出现错误 XML 文档中存在错误 (1, 1)

?<?xml version="1.0" encoding="utf-16"?>

序列化代码:

 string xmlString = null;
 MemoryStream memoryStream = new MemoryStream();
 XmlSerializer xs = new XmlSerializer(typeof(T));
 XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
 ns.Add("abc", "http://example.com/abc/");
 XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream,Encoding.Unicode);
xs.Serialize(xmlTextWriter, obj, ns);
 memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
 xmlString = ConvertByteArrayToString(memoryStream.ToArray());

ConvertByteArrayToString:

   UnicodeEncoding encoding = new UnicodeEncoding();
    string constructedString = encoding.GetString(characters);

反序列化代码:

XmlSerializer ser = new XmlSerializer(typeof(T));
StringReader stringReader = new StringReader(xml);
XmlTextReader xmlReader = new XmlTextReader(stringReader);
object obj = ser.Deserialize(xmlReader);
xmlReader.Close();
stringReader.Close();
return (T)obj;

我想知道我在编码方面做错了什么,我需要一个适用于大多数情况的解决方案。谢谢

【问题讨论】:

    标签: c# xml xml-serialization xml-deserialization


    【解决方案1】:

    使用以下函数进行序列化和反序列化

    public static string Serialize<T>(T dataToSerialize)
    {
        try
        {
            var stringwriter = new System.IO.StringWriter();
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(stringwriter, dataToSerialize);
            return stringwriter.ToString();
        }
        catch
        {
            throw;
        }
    }
    
    public static T Deserialize<T>(string xmlText)
    {
        try
        {
            var stringReader = new System.IO.StringReader(xmlText);
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
        catch
        {
            throw;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的序列化 XML 在开头包含 Unicode byte-order mark,这就是反序列化器失败的地方。

      要删除 BOM,您需要创建一个不同版本的编码抑制 BOM,而不是使用默认的Encoding.Unicode

      new XmlTextWriter(memoryStream, new UnicodeEncoding(false, false))
      

      这里的第二个 false 防止 BOM 被附加到字符串中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-27
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 2018-10-26
        • 1970-01-01
        相关资源
        最近更新 更多