同一类上的两组序列化属性

Posted

技术标签:

【中文标题】同一类上的两组序列化属性【英文标题】:Two sets of serialization attributes on same class 【发布时间】:2011-07-17 07:45:03 【问题描述】:

我遇到了类设计问题。

我正在使用数据合约序列化程序。

所以,在我的所有应用程序共享的程序集中,我有这样的东西:

// Assembly DataContracts.dll: .NET 3.0, used by every subsystems
[DataContract]
public class User

    /// <summary>Nickname.</summary>
    [DataMember]
    public string displayName;

还有更多字段:我只留下了 displayName 试图压缩我的代码清单。

但是,其中一个应用程序是服务器,它需要另一个序列化程序才能应用于同一类,方式如下:

// Assembly ServerDatabase.dll, .NET 4.0, used only by server.
[EseTable]
public class User

    /// <summary>Nickname.</summary>
    [EseText(bUnicode=true, maxChars=71)]
    public string displayName;

ServerDatabase.dll 链接到 .NET 4。此外,[Ese*] 属性定义在一个 DLL 中,由于我无法控制的安全原因,该 DLL 只能由服务器组件加载,所以我不能只是有一个类,每个子系统共享两组属性。

目前,我写的是这样的:

// DataContracts.dll
[DataContract]
public class User

    [DataMember]
    public string displayName;


// ServerDatabase.dll
[EseTable]
public class UserRecord: User

    [EseText(bUnicode=true, maxChars=71)]
    new public string displayName  get  return base.displayName;  set  base.displayName=value;  

    // Note I need to implement an upcasting copy constructor, to convert from User to UserRecord :-(
    public UserRecord(User that)
    
        base.displayName=that.displayName;
    

我不太喜欢我的解决方案:看起来像 hack,而且容易出错。 有什么不同的更好的想法、更正或修复吗?

提前致谢!

【问题讨论】:

次要,但公共领域:不是一个好主意。 【参考方案1】:

我认为该解决方案不会很好,因为子类型和基类型都不需要由“其他”序列化程序处理(如果你明白我的意思的话)。

就个人而言,我会为“不寻常”层创建一个 DTO 层,并在它们之间进行映射。非常像问题中的示例,也许使用 AutoMapper。另一个选项是查看其他序列化程序是否支持来自属性以外的源的元数据。有些会,有些不会。

如果自动映射器导致问题,您可以简单地使用相同的 DCS 属性注释您的服务器 DTO,并使用 DCS 转换模型,即

[EseTable, DataContract]
public class User

    /// <summary>Nickname.</summary>
    [EseText(bUnicode=true, maxChars=71), DataMember]
    public string displayName;

只要名称匹配,DCS 就应该对此感到满意。即使用 DCS 从一个模型序列化并反序列化为 other 模型。我在一些地方使用了类似的技巧(尽管我倾向于为此使用我自己的序列化程序,而不是 DCS - 更快;p)

【讨论】:

以上是关于同一类上的两组序列化属性的主要内容,如果未能解决你的问题,请参考以下文章

在可序列化的 C# 类上使用没有 XmlArray 的 XmlArrayItem 属性

Android Kotlin firebase.database.DatabaseException:在类上找不到要序列化的属性

使用 ProtoBuf-Net 进行两组不同的序列化

JSON序列化(stringify)对象时排除某些属性的两种方法

如何使用 PowerShell 通过 WMI 更新“ds_computer”类上的 LDAP 属性

项目中序列化时,去除属性为null的key