首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得表示Java对象的序列化字节数?

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

Stack Overflow用户
提问于 2010-10-14 22:31:27
回答 6查看 22.1K关注 0票数 19

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

我正在使用一个多代理系统通过消息发送对象,我想要跟踪每条消息占用了多少空间。只要方法与物体的实际尺寸成比例,它就不一定是死气沉沉的准确的。例如,长度为4的字符串向量将报告为小于长度为5的字符串向量。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-14 22:38:43

可以使用ObjectOutputStreamByteArrayOutputStream将对象转换为字节数组。

代码语言:javascript
运行
复制
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 (这意味着您可能必须将每个对象标记为这样简单地得到它的大小。可能不可取)。我编写了一个快速而肮脏的程序来测试这一点:

代码语言:javascript
运行
复制
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;
    }
}

这给了我:

代码语言:javascript
运行
复制
p1 85
p2 94
s1 17
s2 11

编辑

Stephen的回答强调了这种方法的一些注意事项。

票数 28
EN

Stack Overflow用户

发布于 2014-05-06 20:54:36

在调查一个超过memcache大小的服务器错误时,我需要准确地检查每个memcache的写入。为了避免大对象的大字节数组的开销,我将OutputStream扩展为一个计数器:

代码语言:javascript
运行
复制
public class CheckSerializedSize extends OutputStream {

    /** Serialize obj and count the bytes */
    public static long getSerializedSize(Serializable obj) {
        try {
            CheckSerializedSize counter = new CheckSerializedSize();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(counter);
            objectOutputStream.writeObject(obj);
            objectOutputStream.close();
            return counter.getNBytes();
        } catch (Exception e) {
            // Serialization failed
            return -1;
        }
    }

    private long nBytes = 0;

    private CheckSerializedSize() {}

    @Override
    public void write(int b) throws IOException {
        ++nBytes;
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        nBytes += len;
    }

    public long getNBytes() {
        return nBytes;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2010-10-14 22:39:09

您可以将每个对象序列化为数组,并比较每个数组的长度。这不是很准确,在一般情况下,但往往给出一个很好的近似。

看看ObjectOutputStream (可以用来序列化对象并将其转换为bytes)和ByteArrayOutputStream (可以用来保存序列化的字节)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3938122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档