我有一个类,它有一个定义为接口(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/