如何在序列化中更改属性名称(自动生成的 类)?
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 程序集中使用遗留程序集时,它有效地为我扩展了代码。
有关指导/提示,请参阅以下链接:
- 背景信息http://pietschsoft.com/post/2008/02/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer
- 对于指点的问题:How to inject an attribute using a PostSharp attribute?
- 关于如何做类似的事情的演练,这足以开始这个:http://www.postsharp.net/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1
我有一个 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 程序集中使用遗留程序集时,它有效地为我扩展了代码。
有关指导/提示,请参阅以下链接:
- 背景信息http://pietschsoft.com/post/2008/02/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer
- 对于指点的问题:How to inject an attribute using a PostSharp attribute?
- 关于如何做类似的事情的演练,这足以开始这个:http://www.postsharp.net/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1