C# Xml序列化时设置编码格式为utf-8

一、问题描述

问题:对实体类使用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);
        }
    }
}

感谢: XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值