获取套接字流中的一般数据吞吐量

时间:2015-11-14 16:43:15

标签: java

我正在寻找对套接字服务器内外数据的粗略估计。我认为使用序列化将是一个技巧,因为我可以计算一个对象的字节。我知道那里Instrumentation但不想使用它。为什么int会在81回来?!?!它应该是4个字节。

除了一些基础知识之外,我没有关于序列化的勇气的专家,但我并没有期待81!

int x = 1;
long test1 = Tools.serialize("1").length; // returns 8
long test2 = Tools.serialize(x).length; // returns 81 ???

private static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeObject(obj);
    return b.toByteArray();
}

2 个答案:

答案 0 :(得分:1)

当您致电serialize(x)时,x将被装箱到Integer对象,然后writeObject将序列化整个Integer对象,而不仅仅是int对象的值价值。

你必须为任何类型的

做特殊处理
o.writeInt(x);
o.writeLong(x); etc...

这可能就像那个一样简单

if(obj.getClass().equals(Integer.class)){
    Integer i = (Integer) obj;
    o.writeInt(i.intValue());
}
else if(obj.getClass().equals(Long.class)){
   Long l = (Long) obj;
   o.writeLong(l.longValue());
}....
else {
   o.writeObject(obj);
}

有大量的库可以进行具有向后和向前兼容性的序列化工作,选择一个

答案 1 :(得分:1)

因为您将它作为对象传递而不是原始数据类型,所以实际上应该使用o.writeInt(val)

    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeInt(1);
    System.out.println(b.toByteArray().length); //4

所以你应该做的就是为它编写多种方法,如

serialize(int num){...}
serialize(Object obj){...}

这也许有趣http://www.javaworld.com/article/2072752/the-java-serialization-algorithm-revealed.html