如何获取序列化的基础模型对象?

时间:2015-09-01 15:22:46

标签: c# object base

我有2个模型对象:

public class Setting
{
    public Guid Id { get; set; }
    public bool Value { get; set; }
}
public class SettingItem : Setting
{
    public string Description { get; set; }
}

当我从服务器上获取Get时,我得到了用于绑定到UI的SettingItem(带有描述)。在保存时,我想序列化设置(没有描述)返回服务器。为了实现这一点,我试图创建一个类型为Setting的新对象,并使用来自SettingItem的数据填充它,但我的新对象不是Setting类型,它是SettingItem:

        IEnumerable<Setting> settings = new List<Setting>(_settingItems);

我唯一能做的就是这种转换,它违背了继承的意图:

        var settings = _settingItems.Select(n => new NotificationSettingInput()
        {
            NotifyTypeId = n.NotifyTypeId,
            IsOptedIn = n.IsOptedIn
        });

2 个答案:

答案 0 :(得分:1)

您无法永久地将派生类型转换为基类型 - 这完全是故意的,因为多态性和继承都是关于什么的。假设您有一个派生类,它具有重写方法或对您设置的参数强制执行某些条件。

如果您无法组合这些类并使用已建议的[NonSerialized],那么实现此目的的正确方法是初始化基类型并复制值,就像您一样。 (深层复制)我能想到的另一种方法是自定义序列化实现,或者之后修改序列化数据。

例如,在我公司内部,我们有一个序列化类,它采用以下内容:
var xml = _serializer.Serialize<Setting>(settingItem);
所以它只能将类序列化为Setting类型。不确定.Net中的结构是否支持这一点。

编辑看看,您可以执行此操作,具体取决于您选择的序列化方法。例如,使用XmlSerializer:

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(Settings));
x.Serialize(Console.Out, settingsItem);

答案 1 :(得分:0)

这个模型很简单,你可能不必处理继承。您可以使用Description属性标记NonSerialized,假设我们没有错过任何关于您如何实际执行序列化的内容。

public class Setting
{
    public Guid Id { get; set; }
    public bool Value { get; set; }

    [NonSerialized]
    public string Description { get; set; }
}