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

标签 json wcf generics rest datamember

我有一个现有的 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/

相关文章:

json - 为什么json在代码中编码一个空数组会返回null?

c# - 将 JSON 反序列化为 List<T> 时出错

c# - 使用Spring.Net,如何在控制台应用程序中托管WCF服务?

PostgreSQL 9.6 中的 JSON 查询

java - kendo ui grid 未从 servlet 接收 json 数据

wcf - 设计 WCF 数据契约和操作

wcf - 在 WCF Web 编程模型中,如何编写具有一组查询字符串参数(即具有相同名称)的操作协定?

c# - 如何使用 CaSTLe Windsor 注册通用装饰器?

java - 使用带通配符的泛型不允许使用以泛型作为参数的方法

java - 在考虑业务需求变化的情况下,POJO/模型或领域驱动对象的本质到底是什么?