我怎样才能更改属性'序列化中的(自动生成的类)名称?

时间:2015-02-25 14:18:33

标签: c# entity-framework serialization

我有一个如下所示的类,由Entity Framework自动生成,基于我们的数据库:

public partial class TB_Cliente
{
    public int IDCliente { get; set; }
    public string Nome { get; set; }

    // other properties
}

我正在使用DataContractJsonSerializer,我需要更改属性'序列化中的名称。例如,属性IDCliente必须像ClientID一样序列化。

我无法在属性顶部使用[DataMember],因为该类是自动生成的,任何将来的更改都会再次生成该类,这些更改将会丢失。

过去,当我想使用数据注释时,我遇到了同样的问题。我找到了以下解决方案,创建了另一个文件并使用了一个完美运行的界面:

public interface ITB_Cliente
{
    [Required]
    string Nome { get; set; }

    // other properties
}

[MetadataType(typeof(ITB_Cliente))]
public partial class TB_Cliente : ITB_Cliente
{

}

但是这个解决方案现在对我没有帮助,因为(据我所知),这个属性必须直接在类中设置。我试图在界面中设置它并且它没有工作。

有没有办法改变属性'序列化中的名字,在我的情况下?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可能希望使用DTO进行序列化。我没有尝试过,但AutoMapper可能会为你做重任务。

答案 1 :(得分:0)

本周我一直试图克服类似的问题来处理一些遗留的VB.Net类的JSON输出,如果我能避免它,我宁愿不改变它。序列化返回底层私有成员名称而不是公共属性名称,例如“mFirstName”。

同样对于自动生成的属性名称,我得到像json一样的

  

{“k__BackingField”:“Brian”,“k__BackingField”:“Furlong”}

这不好。

我考虑过类似于Pawel的方法(创建DTO并使用我以前广泛使用过的Automapper)。

我也在检查是否可以制作一个定制的json序列化器,但还没有到目前为止。

我调查的第三种方法是使用PostSharp创建一个“Aspect”,它将使用DataContract修饰业务实体类。

这将允许我在编译时在公共属性上创建必要的[DataContract]和[DataMember]属性,而无需修改遗留代码库。当我在新的WebAPI程序集中使用旧程序集时,它有效地为我扩展了代码。

有关指导/提示,请参阅以下链接:

  1. 有关背景信息http://pietschsoft.com/post/2008/02/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer
  2. 针对指针的问题:How to inject an attribute using a PostSharp attribute?
  3. 有关如何做类似的事情的演练,足以让我们继续:http://www.postsharp.net/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1