Java 在套接字流中获得通用数据吞吐量

Java 在套接字流中获得通用数据吞吐量,java,Java,我只是想粗略估计一下socket服务器内外的数据。我认为使用serialize将是一个技巧,因为我可以计算对象的字节数。我知道有仪器,但我不想使用它。为什么int会在81岁的时候回来?!?!它应该是4个字节 除了一些基础知识外,我对连载的胆量还不是专家,但我没想到会是81 int x = 1; long test1 = Tools.serialize("1").length; // returns 8 long test2 = Tools.serialize(x).length; // retu

我只是想粗略估计一下socket服务器内外的数据。我认为使用serialize将是一个技巧,因为我可以计算对象的字节数。我知道有
仪器
,但我不想使用它。为什么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)

因此,您应该为它编写多个方法,如

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

另外,这可能很有趣

是的,解决方案是使用多个重写方法,
serialize(int-val)
serialize(long-val)
etcIf我有一个自定义对象,其中包含字符串和原语,它会将int计算为4吗?实际上,我们将很快地对此进行测试。@kenyu73不,您的自定义对象将使用java序列化进行序列化,这是冗长的
serialize(int num){...}
serialize(Object obj){...}