【问题标题】:DataContract Serialization gives "Index was outside the bounds of the array" exception ..C#DataContract 序列化给出“索引超出数组范围”异常..C#
【发布时间】:2014-09-22 06:23:58
【问题描述】:

我尝试使用 dataContract 序列化程序在 C# 中序列化一个大型树数据结构。我得到循环引用异常。所以我在需要的地方用 [DataContract(IsReference = true)] 而不是 [DataContract] 对类进行了标记。现在我得到“索引超出数组范围”异常。 我的代码如下:

    public void Serialize(object obj, string file, Type t)
    {

        using (FileStream stream1 = new FileStream(file, FileMode.Create))
        {
            stream1.Position = 0;
            DataContractSerializer s = new DataContractSerializer(t);

            s.WriteObject(stream1, obj);
        }


    }

以上代码适用于所有其他序列化。只有在序列化这个树对象的情况下,它才不起作用。我已针对所有必需的类标记了 [DataContract(IsReference = true)],并针对所有必需的属性标记了 [dataMember]。请帮助

【问题讨论】:

  • 文件参数值是多少?这个参数是文件路径还是文件内容?
  • 为什么要使用 FileMode.Create?有必要吗?
  • 参数为:obj为要序列化的内容,file为路径,t为typeof(obj)
  • FileMode.Create() 需要序列化并保留创建文件中的内容
  • 你的文件已经存在了吗?

标签: c# wcf datacontractserializer


【解决方案1】:

我想建议用DataContract(IsReference = true) 属性标记所有继承的类。但是你已经说过你做到了。所以,再次检查你的标记,并确保只标记继承的类。如果只标记了继承的类,但您仍然收到此错误,则只需使用 WCF Tracing 检查您的项目。

跟踪将向您展示序列化过程中发生的情况以及详细信息。

您可以在MSDN找到更多详细信息。

【讨论】:

  • 但是我尝试用更少的元素填充树结构(我正在序列化的对象),它奏效了。当大量填充时,会出现“索引超出数组范围”的错误消息。是不是因为树负载很重。我该如何解决?
  • 可能数据有误?您说过,您的代码在数据较少的情况下运行良好,但在大量数据时会出错。数据如此不同。我再次建议,尝试 WCF Tracing...
  • 出现问题是因为要序列化的对象太大。我该如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多