DataContract已知类型 - 传递数组

时间:2010-05-17 00:40:19

标签: .net wcf serialization datacontract

通过WCF操作传递通用List时遇到问题。在这种情况下,有一个int列表。示例4描述为here in MSDN。请注意,在MSDN示例中,描述了:

  

//这将成功序列化和反序列化,因为泛型List等同于int [],它被添加到已知类型中。

上面是DataContract:

    [DataContract]
    [KnownType(typeof(int[]))]
    [KnownType(typeof(object[]))]
    public class AccountData
    {
        [DataMember]
        public object accNumber1;

        [DataMember]
        public object accNumber2;

        [DataMember]
        public object accNumber3;

        [DataMember]
        public object accNumber4;


    }

在客户端,我调用这样的操作:

DataTransfer.Service.AccountData data = new DataTransfer.Service.AccountData()
{
  accNumber1 = 100,
  accNumber2 = new int[100],
  accNumber3 = new List<int>(),
  accNumber4 = new ArrayList()
};
cService.AddAccounts(data);

此外,这里是生成的AccountData obj(WCF代理)的装饰:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AccountData", Namespace="http://schemas.datacontract.org/2004/07/DataTransfer.Service")]
[System.SerializableAttribute()]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.PurchaseOrder))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.Customer))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(int[]))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(object[]))]

例外是:

  

尝试序列化参数时出错   http://tempuri.org/:myEntity。 InnerException消息是   带有数据合同名称的“输入通用列表”   'ArrayOfint:http://schemas.microsoft.com/2003/10/Serialization/Arrays'   不是预期的。将任何静态未知的类型添加到已知列表中   类型

1 个答案:

答案 0 :(得分:1)

如果你要声明你的类型,那么序列化工作正常:

[DataContract]   
public class AccountData
{
    [DataMember]
    public object accNumber1 {get; set;}

    [DataMember]
    public int[] accNumber2 { get; set; }

    [DataMember]
    public List<int> accNumber3 { get; set; }

    [DataMember]
    public ArrayList accNumber4 {get; set;}

}

(我建议使用属性而不是公共字段。)

你真的需要你的字段是类型对象吗?如果上述类别过于严格,那么就有办法让它更灵活,但可能没有你想象的那么灵活。

另请注意,KnownType属性适用于整个类,而不适用于单个属性。