【问题标题】:How can I change properties' names (of auto generated classes) in serialization?如何在序列化中更改属性的名称(自动生成的类)?
【发布时间】:2015-02-25 14:18:32
【问题描述】:

我有一个类似下面的类,由实体框架自动生成,基于我们的数据库:

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
{

}

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

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

【问题讨论】:

    标签: c# entity-framework serialization


    【解决方案1】:

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

    【讨论】:

    • 我不知道这些事情。您能否提供更多有关它的信息以帮助我开始?我的班级将如何使用它? :)
    • 我不知道你的架构,但如果你 bing/google “DTO 实体框架”,你会发现很多有用的链接 - 例如。 asp.net/web-api/overview/data/…
    • 一个疑问:根据您的建议,我必须创建另一个类,在其中设置我想要的内容并将该类映射到自动生成的类,是吗?
    • 是的。因为您只需要序列化值而不是行为。
    • 我考虑过创建另一个类,我认为 AutoMapper 会帮助我解决这个问题。但是我对这个问题的第一个意图是看看是否会有另一种选择,而不是创建另一个具有相同属性的类。只是为了确定,那么没有办法避免这种情况?
    【解决方案2】:

    本周我一直在尝试解决一些遗留 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多