当前位置: 首页 > 面试题库 >

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

姚星腾
2023-03-14
问题内容

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

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


问题答案:

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



 类似资料:
  • 问题内容: 假设我有一个可序列化的类。 我想通过套接字将其传输到另一台计算机,从接收的字节重建该计算机。 我怎样才能做到这一点? 问题答案: 准备要发送的字节数组: 从字节数组创建对象:

  • 问题内容: 在我的OSGi应用程序我有三捆,,和。取决于取决于。请注意,这并不直接取决于。我使用aQute Bnd生成清单,并且我相信它工作正常。清单如下所示。 有一个名为的类,它具有类型字段,而该字段又具有类型字段。位于,位于和位于。装入捆绑包时,所有这些工作正常。当我收到代表对象的字节数组时,就会出现问题。我必须在捆绑包中反序列化它。这应该不是问题,因为它是在此处定义的。我使用并从捆绑包中传入

  • 问题内容: 我能够将一个对象序列化为一个文件,然后再次还原它,如下面的代码片段所示。我想将对象序列化为字符串并存储到数据库中。谁能帮我? 问题答案: 你应该使用BLOB。使用JDBC非常简单。 你发布的第二个代码的问题是编码。你还应该对字节进行编码,以确保它们均不会失败。 如果你仍然想将其记录为字符串,则可以使用java.util.Base64对字节进行编码。 仍然应该将CLOB用作数据类型,因为

  • 我使用下面的方法(来自spark-java framework的方法)从DB返回的数据如下: 从DB返回的数据: ClasStypeAdapterFactory: 类类型适配器: 这里我使用的是,它从spark-java ResponseTransformer接口实现了

  • 我试图使用SimpleXML序列化HealthCase类的对象。我能够正确地序列化所有内容,除了测试对象的ArrayList和每个测试对象拥有的图像对象的ArrayList。所有类的每个字段都有适当的访问器和突变器方法,但是当我尝试序列化时,会抛出各种xml复合写入错误,并且不会写入相关的XML文件。 HealthCase类(不包括方法): 测试类别(不包括方法): 图像类(不包括方法): 我应该

  • 其中备注是对象内部的vavr列表字段。 现在,如果尝试将相同的值反序列化到对象中,则会出现错误: 当尝试反序列化时,为什么serified JSON文本不起作用? 在Java代码中有没有其他方法可以将vavr对象打印成文本格式并将其转换回POJO?