2011-05-12 38 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