升级项目(.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 可能会有什么变化,或者是否有我需要仔细研究的内容。
如果要
序列化为字符串,则需要使用 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);
}
}