.NET 5.0环境下如何将XML反序列化为internal修饰的C#类
.NET Core 5.0下实现XmlSerializer反序列化internal类的解决方案
默认XmlSerializer确实仅支持反序列化public类及public成员,核心原因是其生成的动态序列化代理类默认没有权限访问当前程序集的internal成员,你可以通过以下三种方案绕过该限制:
方案1:添加InternalsVisibleTo特性开放访问权限(改造成本最低)
直接在程序集层面允许XmlSerializer生成的动态程序集访问当前项目的internal成员,原有序列化逻辑几乎不需要修改:
- 找到项目根目录下的
AssemblyInfo.cs文件(不存在可手动新建),添加如下代码:
using System.Runtime.CompilerServices; // 向XmlSerializer生成的动态程序集开放internal访问权限 [assembly: InternalsVisibleTo("System.Xml.Serialization.XmlSerializer.Generated, PublicKey=0024000004800000940000000602000000240000525341310004000001000100d930e45d30c0c98d2f8ad0664c41f9acf25fd7b40357738d4904d419d312980c567c2109a10563d11e7d9f78412bd58a0492e08785b720b37639a9f510f61589f0b60a2bf13d0a9775d479408994544d73387f4b4af18b031a16b95b54501c7b759e707c3abf130e8e067523871e4440430d48f884b9224f179c1c973e7b40a")]
- 给internal类的属性添加
[XmlElement]特性匹配XML节点即可:
[Serializable] internal class InternalSampleXml { [XmlElement] internal string SampleValue{ get; set; } }
方案2:改用DataContractSerializer实现反序列化
.NET内置的DataContractSerializer原生支持internal类反序列化,不需要修改程序集特性,仅需要添加对应的契约特性即可,改造示例如下:
using System; using System.IO; using System.Runtime.Serialization; using System.Xml; public class Program { public static void Main() { var xml = "<?xml version=\"1.0\"?><SampleXml><SampleValue>sample</SampleValue></SampleXml>"; var serializer = new DataContractSerializer(typeof(InternalSampleXml)); using (var reader = new StringReader(xml)) using (var xmlReader = XmlReader.Create(reader)) { var result = (InternalSampleXml)serializer.ReadObject(xmlReader); Console.WriteLine(result.SampleValue); } } [DataContract(Name = "SampleXml")] internal class InternalSampleXml { [DataMember(Name = "SampleValue")] internal string SampleValue { get; set; } } }
方案3:自定义反射反序列化逻辑(适配极端场景)
如果前两种方案都不满足要求,可以自行解析XML节点,通过反射给internal类的成员赋值,该方案灵活性最高,但需要自己处理XML节点和类成员的映射规则,适合类结构简单的场景。
内容的提问来源于stack exchange,提问作者Rocky Balboa
相关产品推荐
相关产品推荐

