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

时间:2011-03-17 11:00:56

标签: c# serialization .net-3.5 .net-4.0 custom-attributes

我正面临课堂设计问题。

我正在使用数据合同序列化器。

因此,在我所有应用程序共享的程序集中,我有类似的东西:

// 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中定义的,由于安全原因,我只能由服务器组件加载,所以我不能只是有一个类,每个子系统共享两组属性。

目前,我写了这样的话:

// 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;
    }
}

我真的不喜欢我的解决方案:看起来像黑客,而且容易出错。 任何不同的更好的想法,更正或修正?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

如果automapper导致问题,您可以使用相同的DCS属性简单地注释您的服务器DTO,并使用DCS翻译模型,即

[EseTable, DataContract]
public class User
{
    /// <summary>Nickname.</summary>
    [EseText(bUnicode=true, maxChars=71), DataMember]
    public string displayName;
}

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