【问题标题】:WCF Serialization error with "ArrayOfstring" Data Contract带有“ArrayOfstring”数据协定的 WCF 序列化错误
【发布时间】:2009-03-30 01:21:44
【问题描述】:

当我调用我的 WCF 服务时收到下面提到的错误?如何摆脱它?

尝试序列化参数http://tempuri.org/:MyWCFSvc.svc时出错 InnerException 消息是 'Type 'System.String[]' 与数据协定名称 'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays' 预计不会。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。有关详细信息,请参阅 InnerException。*

我尝试在我的 WCF 服务接口中使用 [ServiceKnownType(typeof(string[]))] 但没有成功

【问题讨论】:

  • 您能否提供导致此问题的代码示例?

标签: wcf serialization


【解决方案1】:

晚了一年,但我遇到了同样的问题,这就是你需要做的事情

List<SomeClass> mylist = new List<SomeClass>();

DataContractSerializer dcs = new DataContractSerializer(mylist.GetType());
XmlWriter writer = XmlWriter.Create(sb, XWS);
dcs.WriteObject(writer, query);      
writer.Close();

问题是当你用你的类的类型构造你的序列化器时,序列化器不把它看作一个数组,它只看到一个对象。

如果先这样找到它:

DataContractSerializer dcs = new DataContractSerializer(SomeClass.GetType());
XmlWriter writer = XmlWriter.Create(sb, XWS);
dcs.WriteObject(writer, query[0]);  // Only get the first record from linq to sql
writer.Close();

【讨论】:

  • @KenL:感谢您的回答,但是由于 OP 从未发布他正在使用的代码,您怎么知道您的解决方案会解决他的问题?你所知道的是你收到了一个类似的例外。它可能是由完全不同的东西引起的。
【解决方案2】:

我也遇到了同样的问题,但是在使用 [ServiceKnownType(typeof(string[]))][ServiceKnownType(typeof(int[]))] 对 OperationContract 进行了限定后,问题就解决了。

例如:

[ServiceContract]
    public interface IReportService
    {
        [OperationContract]
        [ServiceKnownType(typeof(string[]))]
        [ServiceKnownType(typeof(int[]))]
        bool GenerateReport(int clientId, int masterId, string reportType, int[] vtIds, DateTime initialDate, DateTime finalDate,
                            bool descending, string userName, string timeZoneId, bool embedMap,
                            object[] vtExtraParameters, object[] vtScheduleParameters, string selectedCriteria,
                            out long reportID, out int scheduleID, out string message);

【讨论】:

  • 我的问题是返回的 DataContract 结构之一包括一个对象类型的 DataMember,该对象类型通常被分配一个内在数据类型(有效),但有时分配一个字符串 [](失败) .像上面一样添加 [ServiceKnownType(typeof(string[]))] 解决了这个问题。
【解决方案3】:

您没有理由必须对字符串数组进行 KnownType。序列化程序应该已经知道这一点,并且数组不是问题。我正在毫无问题地在 WCF 中移动事物列表。您能否发布一个有代表性的示例来说明您正在做什么?

【讨论】:

    【解决方案4】:

    在您的客户端上配置服务引用提供了“数据类型”选项,允许您为集合/字典类型指定不同的类型。里面有什么设置?

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多