【问题标题】:Java: Serializing unknown ArraysizeJava:序列化未知的数组大小
【发布时间】:2008-10-06 10:14:19
【问题描述】:

如果我保护了一个数组并重新加载它,如果它未知,是否有可能获得它的大小? 谢谢

【问题讨论】:

    标签: java serialization objectsize


    【解决方案1】:

    “未知”是什么意思?您可以使用长度字段获取任何 java 数组的长度。

    int[] myArray = deserializeSomeArray();
    int size = myArray.length;
    

    【讨论】:

      【解决方案2】:

      听起来您正在对数组中的各个对象进行序列化和存储(在行间大量阅读之后)。使用 ObjectOutputStream 来存储数组本身。如果存储在数组中的对象是可序列化的,它们也会被存储。当您反序列化时,您将完整地恢复整个数组。

      【讨论】:

      • 根据我的一本书,尝试序列化不可序列化对象数组会引发 NotSerializableException。
      • 没错。我认为假设 wellenreiter 使用的对象是可序列化的是安全的,我只是认为我的解释更清楚一点。遇到相同或类似问题的其他人会欣赏额外的信息。
      【解决方案3】:

      我认为您需要提供更多信息。你是如何保存数组的?使用 ObjectOutputStream?

      【讨论】:

        【解决方案4】:

        不,因为数组的长度只是分配的内存大小除以存储在其中的对象的大小,并且由于没有对象的大小为 0,因此您将始终具有适当的长度,(可能为 0 )

        【讨论】:

          【解决方案5】:

          如果您使用 ObjectInputStream.readObject() 读取保存的数组,它将以适当的长度重新构成,您可以使用 array.length 读取大小。

          【讨论】:

            【解决方案6】:

            正在尝试在字里行间阅读...

            如果您实际上是在读取数组,那么(与 C 不同)所有数组都知道它们的长度。 Java 是一种安全的语言,所以长度是边界检查所必需的。

            MyType[] things = (MyType[])in.readObject();
            int len = things.length;
            

            也许您的困难在于您正在进行自定义(反)序列化并且正在写出数组的各个元素(提示:不要 - 使用数组)。如果您需要捕获 OptionDataException 来检测封闭对象的自定义数据的结尾:

            private static final MyType[] NOTHING = new MyType[0];
            
            private transient MyType[] things = NOTHING;
            
            private void writeObject(ObjectOutputStream out) throws IOException {
                out.defaultWriteObject(); // Do not forget this call!
                for (MyType thing : things) {
                    out.writeObject(thing);
                }
            }
            private void readObject(
                ObjectInputStream in
            ) throws IOException, ClassNotFoundException {
                in.defaultReadObject(); // Do not forget this call!
                List<MyType> things = new ArrayList<MyType>();
                try {
                    for (;;) {
                        things.add((MyType)in.readObject();
                    }
                } catch (OptionalDataException exc) {
                    // Okay - end of custom data.
                }
                this.things = things.toArray(NOTHING);
            }
            

            如果您要执行此类操作,最好在实际数据之前将要读取的对象数量写为 int。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多