代码之家  ›  专栏  ›  技术社区  ›  Erup

DataContract已知类型-传递数组

  •  2
  • Erup  · 技术社区  · 16 年前

    here in MSDN . 请注意,在MSDN示例中,描述了:

    //这将成功地序列化和反序列化,因为泛型列表等效于int[],后者已添加到已知类型。

    上面是数据合同:

        [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对象(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消息无效 具有数据协定名称的“Type Generic List” '阵列查找: http://schemas.microsoft.com/2003/10/Serialization/Arrays 不需要。将静态未知的任何类型添加到已知类型的列表中 类型

    1 回复  |  直到 16 年前
        1
  •  1
  •   Stefan Egli    16 年前

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

    [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;}
    
    }
    

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

    你真的需要你的字段是object类型吗?如果上面的类限制性太强,那么有一些方法可以使它更灵活,但可能没有你想要的那么灵活。

    还要注意的是 KnownType 属性应用于整个类而不是单个属性。