You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何对内部类进行带XML特性的序列化与反序列化?

内部类的XML序列化与反序列化实现方案

问题背景

需要对以下内部类进行XML序列化/反序列化,生成指定格式的XML:

内部类定义

internal class Data
{
    public string? Name { get; set; }
    public string? Type { get; set; }
    public List<DataWithAttribute> DataList { get; set; }
}

internal class DataWithAttribute
{
    public string? FirstAttribute { get; set; }
    public string? SecondAttribute { get; set; }
}

期望XML格式

<Data>
    <Name>Some name</Name>
    <Type>Some value</Type>
    <DataList>
        <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" />
        <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" />
        <DataWithAttribute FirstAttribute="some value" SecondAttribute="some value" />
    </DataList>
</Data>

尝试过XmlSerializer但误以为只能处理公共类,DataContractSerializer支持内部类但无法实现所需的XML属性格式。


解决方案

在同一程序集内,XmlSerializer可以直接处理内部类,只需添加XML序列化特性并编写序列化/反序列化方法:

1. 修改内部类添加XML特性

using System.Xml.Serialization;

internal class Data
{
    public string? Name { get; set; }
    public string? Type { get; set; }
    // 指定数组项的元素名称
    [XmlArrayItem("DataWithAttribute")]
    public List<DataWithAttribute> DataList { get; set; } = new();
}

internal class DataWithAttribute
{
    // 标记为XML属性
    [XmlAttribute]
    public string? FirstAttribute { get; set; }
    [XmlAttribute]
    public string? SecondAttribute { get; set; }
}

2. 序列化方法

using System.IO;
using System.Xml.Serialization;

public static void SerializeData(Data data, string filePath)
{
    // 同一程序集内可访问内部类Type,直接创建XmlSerializer实例
    var serializer = new XmlSerializer(typeof(Data));
    using var writer = new StreamWriter(filePath);
    serializer.Serialize(writer, data);
}

3. 反序列化方法

using System.IO;
using System.Xml.Serialization;

public static Data? DeserializeData(string filePath)
{
    var serializer = new XmlSerializer(typeof(Data));
    using var reader = new StreamReader(filePath);
    return serializer.Deserialize(reader) as Data;
}

关键说明

  • XmlSerializer并非只能处理公共类:在同一程序集内部,可以直接通过内部类的Type创建序列化实例,因为程序集内对内部类有访问权限。
  • 通过[XmlAttribute]特性,将DataWithAttribute的属性序列化为XML节点的属性,匹配期望格式。
  • [XmlArrayItem]确保DataList的子元素名称为DataWithAttribute,与目标XML结构一致。

内容的提问来源于stack exchange,提问作者Kartopelka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:42:40