C# Xml 完整(双标签)序列化

这篇博客介绍了如何在C#中处理XML序列化时,确保空字符串的标签以双标签闭合的形式输出。通过重写XmlTextWriter类并创建新的序列化方法,实现了即使Name标签为空,也能正确地序列化为``的格式。示例代码展示了完整的解决方案。
摘要由CSDN通过智能技术生成

工作中遇到接口对接需求:

<?xml version="1.0"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>1</Id>
  <Name />
  <Age>26</Age>
</Student>

需要将上面的XML文本Name标签,转换成下图格式

<?xml version="1.0" encoding="utf-16"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>1</Id>
  <Name></Name>
  <Age>26</Age>
</Student>

c# xml序列化默认会将空字符串标签,序列化成单标签闭合

如何实现?

重写XmlTextWriter类:

public class FullXmlTextWriter : XmlTextWriter
    {
        public FullXmlTextWriter(TextWriter sink)
            : base(sink) { }
        public FullXmlTextWriter(Stream stream, Encoding enc) : base(stream, enc) { }
        public FullXmlTextWriter(string str, Encoding enc) : base(str, enc) { }

        public override void WriteEndElement()
        {
            base.WriteFullEndElement();
        }
    }

新的序列化方法:

 public static string FullXmlSerialize<T>(T entity)
        {
            MemoryStream stream = new MemoryStream();
            XmlSerializer serializer = new XmlSerializer(entity.GetType());

            FullXmlTextWriter writer = new FullXmlTextWriter(stream, Encoding.Unicode);
            writer.Formatting = Formatting.Indented;//XML格式化,xml序列化实现双标签闭合

            serializer.Serialize(writer, entity);
            StreamReader reader = new StreamReader(stream, Encoding.Unicode);
            stream.Position = 0;
            string xml = reader.ReadToEnd();
            stream.Dispose();
            writer.Dispose();
            reader.Dispose();
            return xml;
        }

添加实体:Student 

[Serializable]
    public class Student
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }

完整代码 program:

 static void Main(string[] args)
        {
            Student stu = new Student
            {
                Age = 26,
                Name = "",
                Id = 1
            };
            string xmlStr = XmlSerializer(stu);
            string xmlFullStr = FullXmlSerialize(stu);
            Console.WriteLine("默认XML:");
            Console.WriteLine(xmlStr);
            Console.WriteLine("完整XML:");
            Console.WriteLine(xmlFullStr);

            Console.ReadKey();
        }


        public static string XmlSerializer<T>(T entity)
        {
            MemoryStream Stream = new MemoryStream();
            XmlSerializer xml = new XmlSerializer(typeof(T));
            //序列化对象
            xml.Serialize(Stream, entity);
            Stream.Position = 0;
            StreamReader sr = new StreamReader(Stream);
            string str = sr.ReadToEnd();

            sr.Dispose();
            Stream.Dispose();
            return str;
        }

        public static string FullXmlSerialize<T>(T entity)
        {
            MemoryStream stream = new MemoryStream();
            XmlSerializer serializer = new XmlSerializer(entity.GetType());

            FullXmlTextWriter writer = new FullXmlTextWriter(stream, Encoding.Unicode);
            writer.Formatting = Formatting.Indented;//XML格式化,xml序列化实现双标签闭合

            serializer.Serialize(writer, entity);
            StreamReader reader = new StreamReader(stream, Encoding.Unicode);
            stream.Position = 0;
            string xml = reader.ReadToEnd();
            stream.Dispose();
            writer.Dispose();
            reader.Dispose();
            return xml;
        }

        public static object XmlDeserialize<T>(Stream stream)
        {
            XmlSerializer xmldes = new XmlSerializer(typeof(T));
            return xmldes.Deserialize(stream);
        }

        public static object XmlDeserialize<T>(string xmlStr)
        {
            using (StringReader sr = new StringReader(xmlStr))
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));
                return xs.Deserialize(sr);
            }
        }

输出:

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#中的XML序列化和反序列化是常用的技术,可以将对象转化为便于传输的XML格式,并且可以将XML格式的数据还原为对象。其中,XML序列化可以使用多种方式实现,比如二进制、字节数组、JSON字符串和XML字符串等。在C#中,可以使用XmlSerializer类的Serialize方法将对象序列化XML字符串,使用Deserialize方法将XML字符串反序列化为对象。\[1\] 在进行XML序列化时,可以通过设置XmlTextWriter的Formatting属性为Formatting.Indented来实现换行显示,使得生成的XML字符串更加可读。另外,需要注意的是,Dictionary本身不支持序列化,所以需要重写为可序列化的SerializableDictionary类来实现对字典的序列化操作。\[2\] 对于XML序列化为对象,可以使用deserialize方法来实现。该方法接受一个XML字符串和一个类型参数,通过使用XmlSerializer类的Deserialize方法将XML字符串反序列化为指定类型的对象。在反序列化过程中,需要使用StringReader将XML字符串转化为可读的流,并使用XmlSerializer类进行反序列化操作。\[3\] #### 引用[.reference_title] - *1* *2* *3* [C# XML序列化和反序列化(XmlSerializer)](https://blog.csdn.net/sD7O95O/article/details/128783513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值