【问题标题】:XML Serialization changes in upgraded project (.NET 3.5 to 4.5)升级项目中的 XML 序列化更改(.NET 3.5 到 4.5)
【发布时间】:2014-12-17 23:25:44
【问题描述】:

最近将一个 3.5 的项目升级到 4.5。我们正在序列化并存储在数据库中的一大块数据,但是每次在升级后的项目中进行保存时,XML 格式都会发生变化,抛出错误,我似乎无法弄清楚核心问题。有 2 个特别提到编码更改的 SO 问题,但我尝试切换到 UTF8(以这些问题的答案中指定的几种不同方式),但没有任何成功 - 使用 UTF8,我只是得到了一堆奇怪的字符整个文件。

我看到的主要问题是:

  • 领先?字符被添加到 XML 中(我发现它是一个有效字符,但我们显然没有处理)
  • 某些节点不包含子节点。

这是我们的序列化方法:

public static string SerializeXml<T>(T instance) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    MemoryStream memStream = new MemoryStream();
    XmlTextWriter xmlWriter = new XmlTextWriter(memStream, Encoding.Unicode);
    serializer.Serialize(xmlWriter, instance);
    memStream = (MemoryStream)xmlWriter.BaseStream;

    return UnicodeEncoding.Unicode.GetString(memStream.ToArray()).Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "");
}

以及我们的反序列化方法:

public static T DeserializeXml<T>(string xml) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(T)); 
    StringReader reader = new StringReader(xml); 

    return (T)xs.Deserialize(reader); 
} 

任何帮助将不胜感激,我对序列化或编码不太熟悉。只是好奇升级到 4.5 后可能发生了什么变化,或者我是否需要仔细研究一下。

【问题讨论】:

  • 不序列化子节点的类是什么样子的?

标签: c# .net xml serialization


【解决方案1】:

如果要序列化为字符串,则需要使用 UTF16。如果要使用 UTF8 进行序列化,则需要序列化为 byte[]。 C# 中的字符串是 UTF16,所以在您发布的代码中,我相信您的所有数据都是用 UTF16 编码的,但是因为您省略了 Xml 声明代码,所以假定它是 UTF8。

我建议使用这样的函数并且不要省略 XmlDeclaration:

    public static string SerializeXmlToString<T>(T instance)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.Unicode;

        StringBuilder builder = new StringBuilder();

        using (StringWriter writer = new StringWriter(builder))
        using (XmlWriter xmlWriter = XmlWriter.Create(writer, settings))
        {
            serializer.Serialize(xmlWriter, instance);
        }

        return builder.ToString();
    }

    public static byte[] SerializeXml<T>(T instance)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.UTF8;

        using (MemoryStream memStream = new MemoryStream())
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(memStream, settings))
            {
                serializer.Serialize(xmlWriter, instance);
            }

            return memStream.ToArray();
        }
    }

    public static T DeserializeXml<T>(string data)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        using (StringReader reader = new StringReader(data))
        {
            return (T)serializer.Deserialize(reader);
        }
    }

    public static T DeserializeXml<T>(byte[] bytes)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        using(MemoryStream stream = new MemoryStream(bytes))
        {
            return (T)serializer.Deserialize(stream);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多