升级项目(.NET 3.5 到 4.5)中的 XML 序列化更改

本文关键字:中的 XML 序列化 项目 NET | 更新日期: 2023-09-27 18:34:36

最近将 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 可能会有什么变化,或者是否有我需要仔细研究的内容。

升级项目(.NET 3.5 到 4.5)中的 XML 序列化更改

如果要

序列化为字符串,则需要使用 UTF16。 如果要使用 UTF8 序列化,则需要序列化为一个字节 []。 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);
        }
    }