一尘不染

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

java

例如,我将使用哪种语法获取表示字符串的字节数并将其与表示该字符串的字节数进行比较ArrayList

我正在使用多代理程序代理系统通过消息发送对象,我想跟踪每条消息占用的空间。只要该方法与对象的实际大小成比例地缩放,该方法就不必精确无误。例如,长度为4的字符串向量将报告为小于长度为5的字符串向量。


阅读 294

收藏
2020-12-03

共1个答案

一尘不染

您可以使用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的答案突出了此方法的一些注意事项。

2020-12-03