gpt4 book ai didi

java - 如何获取表示 Java 对象的序列化字节数?

转载 作者:太空狗 更新时间:2023-10-29 23:02:53 24 4
gpt4 key购买 nike

例如,我将使用什么语法来获取表示字符串的字节数并将它们与表示包含该字符串的 ArrayList 的字节数进行比较?

我正在使用多代理代理系统通过消息发送对象,我想跟踪每条消息占用多少空间。该方法不必完全准确,只要它与对象的实际大小成比例地缩放即可。例如。长度为 4 的字符串 vector 将报告为小于长度为 5 的字符串 vector 。

最佳答案

您可以使用 ObjectOutputStream 将对象转换为字节数组和 ByteArrayOutputStream :

public static int sizeof(Object obj) throws IOException {

ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);

objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();

return byteOutputStream.toByteArray().length;
}

我刚刚测试了这个。您要计算大小的对象需要实现 Serializable (这意味着您可能必须简单地标记每个对象以获得其大小。可能不可取)。我写了一个快速而肮脏的程序来测试这个:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Sizeof {

public static class Person implements Serializable {
private String name;
private String age;

public Person(String name, String age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
}

public static void main(String[] args) {
Person p1 = new Person("Alby", "20");
Person p2 = new Person("VeryLongName", "100");
String s1 = "This is it";
String s2 = "This";

try {
System.out.println("p1 " + sizeof(p1));
System.out.println("p2 " + sizeof(p2));
System.out.println("s1 " + sizeof(s1));
System.out.println("s2 " + sizeof(s2));
}

catch(Exception e) {
e.printStackTrace();
}
}

public static int sizeof(Object obj) throws IOException {

ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);

objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();

return byteOutputStream.toByteArray().length;
}
}

这给了我:

p1 85
p2 94
s1 17
s2 11

编辑

Stephen C 的回答强调了使用此方法的一些注意事项。

关于java - 如何获取表示 Java 对象的序列化字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com