我正面临一个类设计问题。
我正在使用数据协定序列化程序。
所以,在我所有应用程序共享的程序集中,我有这样的东西:
// Assembly DataContracts.dll: .NET 3.0, used by every subsystems
[DataContract]
public class User
{
/// <summary>Nickname.</summary>
[DataMember]
public string displayName;
}
还有更多的字段:我只留下了 displayName 试图压缩我的代码 list 。
但是,其中一个应用程序是一个服务器,它需要另一个序列化器应用到同一个类中,方法如下:
// 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;
}
}
我不太喜欢我的解决方案:看起来像一个 hack,而且容易出错。 任何其他更好的想法、更正或修复?
提前致谢!
最佳答案
我不认为该解决方案会很好地工作,因为子类型和基类型都不需要由“其他”序列化程序处理(如果您明白我的意思的话)。
就个人而言,我会为“不寻常”层创建一个 DTO 层,并在它们之间进行映射。非常像问题中的示例,也许使用 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)
关于c# - 同一类上的两组序列化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5338097/