2012-12-04 88 views
0

有誰知道是否有可能使用2個不同的合約串行器有2個不同的端點?特別是,默認的DataContractSerializer的SOAP/XML和Json.NET串行的REST/JSONWCF的多個序列化裝飾

目的(由於兼容性問題)是具有相同DTO類下面人,序列化到以下JSONXML格式

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> 

可以看出,對於JSON響應應該包含縮水屬性名稱,但對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; } 
} 

我想知道關於如何可以做到這一點的任何想法。

回答

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()之後,返回的GetPersonResponse將使用JSON.Net庫轉換爲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); 
0

一個解決方案是有3個人類具有相同的結構。

[DataMember] 
public class Person_dm 

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

public class Person 

在內部使用Person類,Person_dm和Person_json在它們各自的合同/端點中。您需要在類型之間進行映射,但可以使用Automapper完成。

+0

感謝您的評論。然而,儘管這樣做可行,並且繪圖可以很容易地完成,但是它將三倍不那麼幹淨的DTO,在真實場景中,人們將有大約20個場,並具有其他複雜場地...... – mrd3650