c# - 如何序列化接口(interface)类型成员

标签 c# .net xml-serialization

我有一个类,它有一个定义为接口(interface)的属性。 我的类的用户可以将实现该接口(interface)的任何类实现分配给该属性。 我希望能够从磁盘上的文本文件加载此类状态。用户应该能够手动修改 xml 文件,以控制应用程序的运行。

如果我尝试序列化我的类,它会告诉我无法序列化接口(interface)。 我知道序列化程序不知道属性类的结构,只知道它实现了一个接口(interface)。

我原以为它会在成员上调用 GetType,并反射(reflect)到实际类的结构中。有没有办法做到这一点? 还有其他方法可以实现我的要求吗?

编辑:阐明我的意图: 假设我有这个类(class):

class Car
{
IEngine engine
}
class ElectricEngine : IEngine 
{
int batteryPrecentageLeft;
}
class InternalCombustionEngine : IEngine 
{
int gasLitersLeft;
}

类用户有一个类

Car myCar = new Car();
myCar.Engine = new ElectricEngine() {batteryPrecentageLeft= 70};

当我序列化 myCar 类时,我希望 xml 类似于这样:

<Car>
<Engine>
<ElectricEngine>
<batteryPrecentageLeft>70</batteryPrecentageLeft>
</ElectricEngine>
<Engine>
</Car>

最佳答案

您可以将属性标记为不包含。

但还有一个更深层次的问题:序列化只能捕获简单的“状态”,而不是行为。您的类(class)不是可序列化的。您期望该属性在反序列化后具有什么“值(value)”? null 是唯一的选择。

正确的解决方法是考虑实际应该保存什么并为该部分使用 DTO。


可以序列化以下模型:

public class BaseEngine { }

[XmlInclude(typeof(InternalCombustionEngine))]
[XmlInclude(typeof(ElectricEngine))]
public class Car
{      
    public BaseEngine Engine { get; set; }
}

关于c# - 如何序列化接口(interface)类型成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252207/

相关文章:

c# - 空引用异常数组 2d

c# - Hook WinForms TextBox 控件的默认 "Paste"事件

c# - 迁移到 AutoMapper 5 - 循环引用

c# - 错误: String or binary data would be truncated. 表值参数的数据不符合参数的表类型

java - Simple 2.6.7 处理枚举的方式与 Simple 2.6 不同吗?

c# - 在 List<> 的某个索引处查找项目、修改项目然后更新 List<> 的最有效方法?

c# - '/' 应用程序中的服务器错误

c# - MongoDB 选择与 QueryBuilder

c# - 我想将现有的 List<T> 保存到 c# 中的 XML 文件中

c# - 如何序列化List<IFilter>(诺基亚成像SDK)?