【问题标题】:DataContract Known Types - passing arrayDataContract 已知类型 - 传递数组
【发布时间】:2011-02-20 05:26:34
【问题描述】:

通过 WCF 操作传递通用列表时遇到问题。在这种情况下,有一个 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' 预计不会。将任何静态未知的类型添加到已知列表中 类型

【问题讨论】:

  • 对不起,我现在添加了异常描述。请注意,它已包含 DataContract 中指定的 KnownTypeAttribute。
  • 我遇到了同样的问题。您不能将 int[] 和 List 添加到已知类型,因为它会引发错误,抱怨它们是相同的。但是,如果我只添加 int[],则会为 List 引发序列化异常。奇怪....
  • 你解决了这个问题吗,我也遇到了类似的问题

标签: .net wcf serialization datacontract


【解决方案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 属性适用于整个类而不是单个属性。

【讨论】:

  • 我正在使用 KnownTypeAttribute 进行测试并研究 MSDN 示例(这就是 object prop 的原因)。我会试试你的建议。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2020-09-13
  • 2010-10-06
  • 2018-02-15
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多