WCF的多个序列化装饰

时间:2012-12-04 21:09:53

标签: xml json wcf data-serialization

是否有人知道是否可以使用2个不同的合同序列化器来拥有2个不同的端点?特别是,SOAP / XML的默认DataContractSerializer和REST / JSON的Json.NET序列化器

目标(适当的兼容性问题)是在下面使用相同的 DTO类人员,序列化为以下 JSON XML 格式< / p>

DTO课程:

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

JSON

{Psn:{"Nm":"name1","Snm":"surname1"}}

XML

<Person><Name>name1</Name><Surname>surname1</Surname></Person>

可以看出,Response for JSON应该包含shrunk属性名称,但是包含XML版本的完整属性名称。

我的想法是有序列化注释,DataContractSerialiser理解的那些以及Json.Net序列化器理解的那些,即这类:

[DataMember]
[JsonObject(Title="Psn")]
public class Person
{
    [DataMember]
    [JsonProperty(PropertyName="Nm")]
    public string Name { get; set; }

    [DataMember]
    [JsonProperty(PropertyName="Snm")]
    public string Surname { get; set; }
}

我很感激有关如何实现这一目标的任何想法。

2 个答案:

答案 0 :(得分:0)

一种解决方案是拥有具有相同结构的3人类。

[DataMember]
public class Person_dm

[JsonObject(Title="Psn")]
public class Person_json

public class Person

在内部使用Person类,在各自的合同/端点中使用Person_dm和Person_json。您需要在类型之间进行映射,但这可以使用Automapper完成。

答案 1 :(得分:0)

最终实现的方式是使用WCF原始方法。 http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx

保持问题中提到的相同DTO,创建了两个运营合同。

一个用于SOAP / XML GetPersonResponse GetPerson(GetPersonRequest request),另一个用于REST / JSON System.IO.Stream GetPerson_Rest(params...)

我们会根据需要实施GetPerson()。然后在GetPerson_Rest()中,我们将调用GetPerson()之后使用JSON.Net库将返回的GetPersonResponse转换为Json。最后,该方法将返回一个Stream对象,如下面的代码片段所示:

string jsonResponse = JsonConvert.SerializeObject(response);

// Serialize into stream of bytes
byte[] rawResponse = Encoding.UTF8.GetBytes(jsonResponse);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";

// Return json raw response
return new MemoryStream(rawResponse);