我只是想粗略估计一下套接字服务器中的数据。我认为使用序列化将是一个技巧,因为我可以计算对象的字节数。我知道有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();
}
当您调用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);
}
有很多库可以做具有前后兼容性的串行化工作,选择一个
因为您将它作为对象而不是基元数据类型传递,所以实际上应该使用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