gpt4 book ai didi

json - WCF - 泛型类的 DataMember 的自定义名称

转载 作者:行者123 更新时间:2023-12-05 01:04:54 25 4
gpt4 key购买 nike

我有一个现有的 WCF REST/JSON 服务,它返回不同类型数据的列表。我想向每个响应添加一个代表修订号的属性。

假设我有一个“汽车”类

[DataContract]
public class Car {
[DataMember]
public String make;
[DataMember]
public String year;
}

当前/cars/返回一个 Cars 数组,如下所示

{ [ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

现在,我希望响应是

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ]}

如果我只有一个汽车类,这是微不足道的,但我的服务有数百个简单实体,我希望每个实体都返回修订属性和实体列表。我想我可以像下面这样创建一个通用类来包装现有项目。

[DataContract]
public class VersionedItem<T> {
String revision;
T item;

[DataMember]
public String revision {
get{}
set{}
}

[DataMember]
public T item {
get{}
set{}
}
}

这几乎可以很好地工作,除非我需要返回以下内容:

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

这实际上是返回

{ revision:"1234", item:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

问题 1:有什么方法可以专门化泛型类的实例以指定项目属性的正确名称(在本例中为汽车)? IE,(完全是废话,但为了帮助理解这一点)

public class VersionedCar : VersionedItem<Car>
{
[DataMember(Name="cars")]
public Car item{
get{}
set{}
}
}

问题 2:如果不是,实现包装所有响应并在所有响应中包含新属性的最佳方法是什么?

最佳答案

您可以插入一个“操作格式化程序”。例如,使用 Reflector,看看 WebHttpBehavior 如何插入并使用 DataContractJsonSerializerOperationFormatter。

为此,您首先需要插入您自己的服务端点行为(类似于 WebHttpBehavior。)当行为被要求用于操作格式化程序时,您返回它您自己的自定义格式化程序(类似于 DataContractJsonSerializerOperationFormatter。_所有这些自定义formatter 所做的是在委托(delegate)给通常的序列化机制之前,围绕它通常序列化的数据序列化一个版本包装器。

您还需要类似的客户端行为和相同的格式化程序,回到客户端,以便可以在 WCF 客户端上处理此类消息。

希望这对您有所帮助!

关于json - WCF - 泛型类的 DataMember 的自定义名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9540859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com