ExtensionDataObject成员为私有,如何实现其数据读写操作?
问题核心结论
ExtensionDataObject 没有提供公开的业务侧读写API,它的设计定位仅为序列化往返过程的未知数据兜底存储——保证反序列化时遇到的未定义字段,在后续重新序列化时不会丢失,本身就不是给开发者直接操作数据用的,这也是你找不到公开读写方法的根本原因。
可行实现方案
方案1:替换序列化库(推荐,无兼容风险)
如果你的需求是灵活读写JSON中的自定义/未知属性,直接弃用老旧的DataContractJsonSerializer,改用目前主流的JSON序列化库,它们都提供了透明可操作的扩展数据存储:
- 使用Newtonsoft.Json(Json.NET)
给类添加扩展数据字典,所有未匹配到类属性的JSON字段都会自动存入这个字典,可直接读写:
操作示例:public class ExtData { // 你定义的已知属性可以正常写在类中 public string KnownProperty { get; set; } [Newtonsoft.Json.JsonExtensionData] public Dictionary<string, Newtonsoft.Json.Linq.JToken> DynamicProperties { get; set; } = new(); }// 读未知属性 var helloValue = ed.DynamicProperties["Hello"].ToString(); // 写自定义属性 ed.DynamicProperties["CustomKey"] = "CustomValue"; - 使用System.Text.Json(.NET Core 3.0+内置)
用法和Newtonsoft.Json基本一致,扩展数据字典类型为Dictionary<string, JsonElement>:public class ExtData { [System.Text.Json.Serialization.JsonExtensionData] public Dictionary<string, System.Text.Json.JsonElement> DynamicProperties { get; set; } = new(); }
方案2:反射操作ExtensionDataObject(极度不推荐)
如果受项目限制必须使用DataContractJsonSerializer,只能通过反射访问ExtensionDataObject的非公开内部成员来读写数据,但不同.NET版本(.NET Framework、.NET Core、.NET 5+)的该类内部结构存在差异,没有统一的稳定实现,生产环境使用极容易出现版本兼容故障。
注意:微软官方文档从未将
ExtensionDataObject的内部成员纳入公开兼容承诺,任何基于反射的操作都属于对非公开实现的硬编码依赖,后续框架版本更新可能直接导致代码崩溃。
内容的提问来源于stack exchange,提问作者LeiMagnus
相关产品推荐
相关产品推荐

