一、问题描述
问题:对实体类使用Serialize进行序列化后,Xml的编码格式默认是utf-16,且不能更改。如下:
<?xml version="1.0" encoding="utf-16"?>
修改前的代码
变量sw的编码格式是只读字段,不能修改
public static string XmlSerialize<T>(T obj, XmlSerializerNamespaces xmlNamespaces)
{
using (StringWriter sw = new StringWriter())
{
Type t = obj.GetType();
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(sw, obj, xmlNamespaces);
return sw.ToString();
}
}
二、解决方案
使用可修改编码类型的StreamWriter,指定xml的编码格式
MemoryStream ms = new MemoryStream();//定义一个内存流 XmlTextWriter textWriter = new XmlTextWriter(ms,Encoding.GetEncoding("gb2312"));//定义输>出的编码格式
还有把内存流转成字符串
string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
修改后的代码
/// <summary>
/// 将实体类对象转换成XML(带命名空间前缀)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj">类对象类型</param>
/// <param name="xmlNamespaces">命名空间信息</param>
/// <returns></returns>
public static string XmlSerialize<T>(T obj, XmlSerializerNamespaces xmlNamespaces)
{
using (MemoryStream ms = new MemoryStream())
{
//XmlTextWriter textWriter = new XmlTextWriter(ms, Encoding.GetEncoding("utf-8")); // 不带换行符,开头带BOM标记
//StreamWriter textWriter = new StreamWriter(ms, Encoding.GetEncoding("utf-8")); // 带换行符,开头带BOM标记
using (StreamWriter textWriter = new StreamWriter(ms, new UTF8Encoding())) // 带换行符,开头不带BOM标记
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(textWriter, obj, xmlNamespaces);
// 这里有个坑,ms.GetBuffer的长度是缓冲区的总大小,并不是实际长度,所以此处需要指定实际存储的数据长度。否则转换后的string会有多余的/0占位
return Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
}
}
}