如何在序列化中更改属性名称(自动生成的 类)?

How can I change properties' names (of auto generated classes) in serialization?

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

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

    // other properties
}

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

我不能在 属性 之上使用 [DataMember],因为 class 是自动生成的,以后的任何更改都会再次生成 class,并且这些更改将会丢失。

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

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

    // other properties
}

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

}

但是这个解决方案现在对我没有帮助,因为(据我所知)这个属性必须直接在 class 中设置。我试过在界面里设置,没用。

在我的例子中,有没有办法更改序列化中的属性名称?任何帮助将不胜感激。

您可能想使用 DTO 进行序列化。我没有尝试过,但 AutoMapper 可能可以为您完成繁重的工作。

这周我一直在努力解决一些遗留 VB.Net 类 的 JSON 输出的类似问题,如果可以避免,我宁愿不更改。序列化返回底层私有成员名称而不是 public 属性 名称,例如"mFirstName".

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

{"k__BackingField":"Brian","k__BackingField":"Furlong"}

哪个不好

我考虑了与上述 Pawel 类似的方法(创建 DTO 并使用我之前广泛使用过的 Automapper)。

我也在检查是否可以制作自定义的 json 序列化程序,但还没有走得很远。

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

这将允许我在编译时在 public 属性上创建必要的 [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