如何拆分C#数据类的Xml序列化?接口方案遇类型识别问题
接口拆分序列化方案的可行性与代码问题分析
方案可行性
通过接口拆分序列化字段的思路是可行的,但你的当前代码实现存在关键错误,导致无法达到只序列化接口字段的预期效果。
代码存在的问题
- 类型获取错误:
(PuppiesAndKittensInstance as IPuppies).GetType()返回的是对象的实际运行时类型(即PuppiesAndKittens类),而非接口IPuppies的类型。因此XmlSerializer会按照完整类的结构序列化所有15个字段,而非你期望的8个接口字段。 - 缺少实现类型声明:直接序列化接口类型时,
XmlSerializer需要明确知道接口对应的具体实现类,否则会抛出序列化异常。
修正后的实现方式
要实现按接口字段序列化,需要调整XmlSerializer的创建方式,并告知序列化器接口的实现类:
方法1:给接口添加XmlInclude特性
[XmlInclude(typeof(PuppiesAndKittens))] public interface IPuppies { bool PuppyEats { get; set; } bool PuppyBarks { get; set; } // 剩余6个接口字段... }
然后修改序列化代码,直接指定序列化类型为IPuppies:
StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { XmlSerializer s = new XmlSerializer(typeof(IPuppies)); s.Serialize(sw, PuppiesAndKittensInstance as IPuppies); }
方法2:在XmlSerializer构造函数中传入已知类型
如果不想修改接口定义,可以在创建序列化器时,通过构造函数参数传入接口的实现类:
StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { XmlSerializer s = new XmlSerializer(typeof(IPuppies), new Type[] { typeof(PuppiesAndKittens) }); s.Serialize(sw, PuppiesAndKittensInstance as IPuppies); }
上述两种方式都能让XmlSerializer按照IPuppies接口的定义序列化,仅包含接口声明的8个字段,满足写入txtFile_A的需求。同理,你可以定义包含后7个字段的IKittens接口,用相同方式序列化到txtFile_B。
内容的提问来源于stack exchange,提问作者RandomWalk
相关产品推荐
相关产品推荐

