2011-05-12 54 views
3

其實應該有一個直截了當的回答這個問題(是關於下面的「對象」屬性):WCF - 作爲已知類型的對象 - >可互操作?

具有下列數據合同:

[KnownType(typeof(bool))] 
    [KnownType(typeof(int))] 
    [KnownType(typeof(string))] 
    [KnownType(typeof(Customer))] 
    [KnownType(typeof(Client))] 
    public class Transaction 
    {  
     // properties 
     [DataMember(Name = "UID")] 
     public int UID{} 

     [DataMember(Name = "Type")] 
     public Enums.TransactionType Type{} 

     [DataMember(Name = "Data")] 
     public Object Data{} 
    } 

及以下的服務合同:

public interface IService 
{ 
     [OperationContract(Name = "GetData")] 
     List<Transaction> GetTransact(); 
} 

這是否可以互操作?從Java來說,gSoap?如果不是,我該如何使它可以互操作?

謝謝。

編輯: 我只是想知道,如果WCF知道如何序列化/反序列化從/對象進入定義的已知類型。

回答

1

只要客戶端可以從WSDL正確生成類型,就應該沒問題。例如,根據客戶端的不同,它可能會將C#的List<Transaction>更改爲Transaction[]或其他相當的東西。您還需要選擇正確的綁定類型。通常basicHttpBinding對於互操作性來說是最好的結果。

+0

是的,這很清楚......但我只想知道WCF是否知道如何使用定義的已知類型從Object中序列化/反序列化。 – Learner 2011-05-12 15:33:51

+1

作爲[KnownType]添加的東西可以告訴序列化程序關於它們的信息,並將它們添加到WSDL中。如果序列化程序得到一個對象,那麼是的,它會掃描適合的KnownTypes。通常這與繼承有關,比任何事情都重要。 – CodingWithSpike 2011-05-12 16:39:20

+1

另外,對不起,我沒有注意到我第一次看到這個,你的一個數據成員是'Object'類型的。在這種情況下,只要實際實例的類型爲「Customer」或「Client」,我希望WCF能夠處理Object'Data'字段。在序列化時,它將從實例類型中知道,在反序列化中,它將從SOAP消息中傳遞的類型名稱中知道。 – CodingWithSpike 2011-05-12 16:42:39