【问题标题】:How do I get the base model object for serialization?如何获取用于序列化的基本模型对象?
【发布时间】:2015-09-01 15:22:46
【问题描述】:

我有 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
        });

【问题讨论】:

    标签: c# object base


    【解决方案1】:

    您不能将派生类型永久转换为基类型 - 这完全是经过深思熟虑的,因为这就是多态性和继承的全部意义所在。假设您有一个派生类,它具有重写方法或对您设置的参数强制执行某些条件。

    如果您不能像已经建议的那样组合类并使用[NonSerialized],则完成此操作的正确方法是初始化基本类型并像您一样复制值。 (深拷贝)我能想到的另一种方式,是自定义序列化实现,或者之后修改序列化数据。

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

    EDIT刚刚看了,可以根据自己选择的序列化方式来做。例如,使用 XmlSerializer:

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

    【讨论】:

      【解决方案2】:

      此模型非常简单,您可能不必处理继承问题。您可以使用NonSerialized 属性标记Description,假设我们没有遗漏您实际执行序列化的任何内容。

      public class Setting
      {
          public Guid Id { get; set; }
          public bool Value { get; set; }
      
          [NonSerialized]
          public string Description { get; set; }
      }
      

      【讨论】:

      • 我怀疑 Setting 类是在客户端和服务器之间使用公共库共享的,并且由于服务器需要能够将描述传递给客户端,所以这不起作用。
      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多