为什么指定Map的初始容量会导致后续序列化产生不同的结果?

用户名

我正在尝试比较2 byte[],这是同一对象的序列化结果:

  • byte[]通过序列化对象创建1
  • 另一种方法是反byte[]序列化第一个,然后再次对其进行序列化。

我不明白这两个数组有何不同。反序列化第一个byte[]对象应重建原始对象,而序列化该对象与序列化原始对象相同。因此,这2个byte[]应该相同。但是,在某些情况下,它们显然可以有所不同。

我要序列化的对象(State)包含另一个对象(MapWrapper的列表,而该对象又包含一个集合。根据集合的不同,我的比较代码会得到不同的结果。

这是MCVE:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {

    public static void main(String[] args) {

        State state = new State();
        state.maps.add(new MapWrapper());

        byte[] pBA = stateToByteArray(state);
        State pC = byteArrayToState(pBA);
        byte[] zero = stateToByteArray(pC);
        System.out.println(Arrays.equals(pBA, zero)); // see output below
        State pC2 = byteArrayToState(pBA);
        byte[] zero2 = stateToByteArray(pC2);
        System.out.println(Arrays.equals(zero2, zero)); // always true
    }

    public static byte[] stateToByteArray(State s) {

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(s);
            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static State byteArrayToState(byte[] bytes) {

        ObjectInputStream ois;
        try {
            ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
            return (State) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

class State implements Serializable {

    private static final long serialVersionUID = 1L;

    List<MapWrapper> maps = new ArrayList<>();
}

class MapWrapper implements Serializable {

    private static final long serialVersionUID = 1L;

    // Different options, choose one!
//  List<Integer> ints = new ArrayList<>();       true
//  List<Integer> ints = new ArrayList<>(3);      true
//  Map<String, Integer> map = new HashMap<>();   true
//  Map<String, Integer> map = new HashMap<>(2);  false
}

由于某种原因,如果MapWrapper包含一个HashMap(或LinkedHashMap以初始容量进行初始化,则序列化的结果与序列化-反序列化-序列化的结果不同。

我添加了反序列化-序列化的第二次迭代,并与第一次迭代进行了比较。他们总是平等的。差异仅在第一次迭代后才显示。

请注意,我必须创建一个MapWrapper并将其添加到中的列表中State(如在开始时所做的那样)main,以引起此情况。

据我所知,初始容量仅仅是性能参数使用默认的一个或指定的一个不应更改行为或功能。

我正在使用jdk1.8.0_25和Windows7。

为什么会这样?

安迪·特纳(Andy Turner)

HashMap源代码中readObject的以下行和注释说明了区别:

s.readInt();                // Read and ignore number of buckets

实际上,查看字节的十六进制,区别在于数字2(您配置的存储桶数)和数字16(默认存储桶数)之间。我没有检查过这个特定字节的含义;但如果是其他情况,那将是一个巧合,因为这是唯一的区别。

<snip> 08 00 00 00 02 00 00 00 00 78 78   // Original
<snip> 08 00 00 00 10 00 00 00 00 78 78   // Deserialized+serialized.
                   ^

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么序列化NameValueCollection会导致数据丢失?

来自分类Dev

为什么序列化 Integer 会产生过多的开销?

来自分类Dev

为什么不同的scrypt实现会产生不同的结果?

来自分类Dev

为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

来自分类Dev

为什么Round会产生与Application.Round不同的结果

来自分类Dev

为什么setTimeout调用会产生不同的结果

来自分类Dev

为什么Python的“ .split()和”“ .split(”,“)会产生不同的结果?

来自分类Dev

为什么确定系数R²实现会产生不同的结果?

来自分类Dev

为什么Python的“ .split()和”“ .split(”,“)会产生不同的结果?

来自分类Dev

SQL在从句中,为什么会产生不同的结果?

来自分类Dev

为什么使用引号时“ wsl”会产生不同的结果?

来自分类Dev

为什么我的Cypher查询会产生不同的结果?

来自分类Dev

为什么在Spark Shell中使用自定义案例类会导致序列化错误?

来自分类Dev

为什么更改类的属性会导致不同的结果?

来自分类Dev

为什么列表初始化会导致Seg错误?

来自分类Dev

FOSElastica为什么我的结果未序列化?

来自分类Dev

为什么通过条件运算符将引用传递给初始化程序列表会导致警告?

来自分类Dev

方法同步,但代码会产生随机结果由于非序列化线程行为

来自分类Dev

为什么过滤可观察的订阅结果会产生与过滤可观察的结果不同的结果

来自分类Dev

为什么括号会产生不同的答案?

来自分类Dev

序列化混合值xml元素会产生错误

来自分类Dev

为什么RegEx.test会更改后续调用的结果?

来自分类Dev

为什么不同值不会在非原子化序列上产生不同的值

来自分类Dev

任务在Spark中产生了不可序列化的结果

来自分类Dev

为什么用-fllvm编译此Haskell程序会产生不同的结果?

来自分类Dev

为什么应用bezierPathWithRoundedRect蒙版与设置图层的cornerRadius会产生不同的结果?

来自分类Dev

为什么-1 >> 1和0xFFFFFFFF >> 1会产生不同的结果?

来自分类Dev

为什么Go中的float常量和变量会产生不同的结果?

来自分类Dev

为什么同一条语句中的左移和右移会产生不同的结果?

Related 相关文章

  1. 1

    为什么序列化NameValueCollection会导致数据丢失?

  2. 2

    为什么序列化 Integer 会产生过多的开销?

  3. 3

    为什么不同的scrypt实现会产生不同的结果?

  4. 4

    为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

  5. 5

    为什么Round会产生与Application.Round不同的结果

  6. 6

    为什么setTimeout调用会产生不同的结果

  7. 7

    为什么Python的“ .split()和”“ .split(”,“)会产生不同的结果?

  8. 8

    为什么确定系数R²实现会产生不同的结果?

  9. 9

    为什么Python的“ .split()和”“ .split(”,“)会产生不同的结果?

  10. 10

    SQL在从句中,为什么会产生不同的结果?

  11. 11

    为什么使用引号时“ wsl”会产生不同的结果?

  12. 12

    为什么我的Cypher查询会产生不同的结果?

  13. 13

    为什么在Spark Shell中使用自定义案例类会导致序列化错误?

  14. 14

    为什么更改类的属性会导致不同的结果?

  15. 15

    为什么列表初始化会导致Seg错误?

  16. 16

    FOSElastica为什么我的结果未序列化?

  17. 17

    为什么通过条件运算符将引用传递给初始化程序列表会导致警告?

  18. 18

    方法同步,但代码会产生随机结果由于非序列化线程行为

  19. 19

    为什么过滤可观察的订阅结果会产生与过滤可观察的结果不同的结果

  20. 20

    为什么括号会产生不同的答案?

  21. 21

    序列化混合值xml元素会产生错误

  22. 22

    为什么RegEx.test会更改后续调用的结果?

  23. 23

    为什么不同值不会在非原子化序列上产生不同的值

  24. 24

    任务在Spark中产生了不可序列化的结果

  25. 25

    为什么用-fllvm编译此Haskell程序会产生不同的结果?

  26. 26

    为什么应用bezierPathWithRoundedRect蒙版与设置图层的cornerRadius会产生不同的结果?

  27. 27

    为什么-1 >> 1和0xFFFFFFFF >> 1会产生不同的结果?

  28. 28

    为什么Go中的float常量和变量会产生不同的结果?

  29. 29

    为什么同一条语句中的左移和右移会产生不同的结果?

热门标签

归档