我有一个如下所示的类,由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
{
}
但是这个解决方案现在对我没有帮助,因为(据我所知),这个属性必须直接在类中设置。我试图在界面中设置它并且它没有工作。
有没有办法改变属性'序列化中的名字,在我的情况下?任何帮助将不胜感激。
答案 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程序集中使用旧程序集时,它有效地为我扩展了代码。
有关指导/提示,请参阅以下链接: