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

标签 java

例如,我将使用什么语法来获取表示字符串的字节数并将它们与表示包含该字符串的 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/

相关文章:

java - newSingleThreadScheduledExecutor 的工作,如果线程已经忙

java - Matlab 函数 'quad' 在 Java 和 C++ 中可用吗?

java - 如何从JDOM获取节点内容

Java JFrame 的大小不准确

Java - 生成自定义运行时错误而不转储跟踪

java - 如何读取play框架模板中的注释值?

java - Android 将字符串转换为 JSON

java - 按钮 setOnClickListener 导致应用程序崩溃

java - 异步多线程: Error compiling shader. (libgdx)

Swing 应用程序中的 JavaFX 2.2 JFXPanel 显示 Swing 模态对话框