gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:16:37 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com