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

2024-03-25

我将使用什么语法来获取表示字符串的字节数并将它们与表示字符串的字节数进行比较ArrayList例如,拿着那根绳子?

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


您可以使用将对象转换为字节数组ObjectOutputStream http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html and ByteArrayOutputStream http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html:

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 http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html(这意味着您可能必须对每个对象进行标记才能获得其大小。可能并不理想)。我编写了一个快速而肮脏的程序来测试这一点:

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

EDIT

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取表示 Java 对象的序列化字节数? 的相关文章

随机推荐

  • 为什么 git log 在传递给寻呼机时不显示 HEAD 和分支

    当传递给寻呼机时 git log less watch git log https stackoverflow com q 62803231 9157799等 则 HEAD gt master origin master origin HE
  • Pylance 无法识别新安装的 pip 软件包

    我在尝试从 pip 导入新安装的软件包时收到以下错误 无法解析导入 皮兰斯 报告缺少进口 重新启动 VS Code 后 Pylance 似乎能够识别该包 有没有办法解决这个问题 因为它很烦人 当 Pylance 没有立即检测到该模块时 就会
  • Greasemonkey 中的函数未定义或访问对象的权限被拒绝

    我正在开发一个 Greasemonkey 脚本 该脚本将一个按钮注入聊天系统 Gitter 允许您发送默认消息 不是垃圾邮件 管理员可以发送类似行为准则的消息 假设我已经注入了一个按钮
  • 为 Flask-CORS 指定域

    我有一个 Python 脚本作为 Web api 许多域会调用它来获取他们想要的数据 因此 为了使其可行 我需要启用 CORS 我通读了 Flask 文档 但没有找到指定多个域以允许 CORS 的方法 以下是启用 CORS 的代码片段 fr
  • 访问 VBA 循环(无响应)

    我正在循环访问记录集以执行一些基本功能或编辑 通常 对于包含超过 50 条记录的记录集 访问将停止响应 I have me repaint在循环命令之前 但窗口始终冻结并且访问标题栏显示 未响应 知道如何解决这个问题吗 Thanks Dav
  • 缺少 google-services.json 并运行“make bootstrap”(Kickstarter 应用程序 android studio)

    当我尝试运行该应用程序时 遇到了此谷歌服务缺失错误来自 GitHub 的 Kickstarter https github com kickstarter android oss在 Android Studio 中 试图寻找答案 我发现我应
  • 将用户输入循环附加到列表中

    我是 python 编程新手 正在用它做一些实验 希望我的问题不太愚蠢 我正在编写一个小程序 将输入添加到列表中 并使用 while 循环在输入等于 4 时打印它 问题是它永远不会停止添加输入和打印列表 我的代码是 S input L wh
  • 根据查找 NP 头的规则在 NLTK 和 stanford 解析中查找名词短语的头

    一般来说 名词短语的中心词是位于 NP 最右边的名词 如下所示 树是父 NP 的中心词 所以 ROOT S NP PP
  • 如何在Python中将多行输入读取到二维数组中

    我在 python 中遇到了一个问题 要读取的二维数组的输入格式是 3 number of rows and columns of a square matrix 1 2 3 first row 3 4 6 second row 4 6 3
  • 从另一个 ViewController 调用方法

    我有一个 ViewControllerA 和一个 ViewControllerB 我想从 ViewControllerB 调用 ViewControllerA 的方法 在 ViewControllerA 中存在一个方法 NSMutableA
  • 使用 matplotlib plt.show() 绘图不可见

    我对 Python 和 Linux 非常陌生 我需要帮助 我尝试使用 matplotlib 按以下方式显示简单的绘图 from matplotlib import pyplot as plt plt plot 5 6 7 8 7 3 8 3
  • 我如何使用纯javascript解析远程html页面

    我需要解析远程 html 页面 例如 www mywesite com home 我如何获取此网站 html 页面源以及如何解析此页面 html是这样的 div class my class1 a href home link id 1 h
  • iOS 7.1 中的 safari 全屏,带有最小的 ui 元标记

    我在多个网站 包括一些 stackoverflow 问题 上读到 iOS 7 1 Safari 将会有一个 minim ui 元标记 所以今天我更新了我的iPad 但似乎没有效果 任何人都可以确认这应该有效吗 这是我的元标记 此选项仅适用于
  • celery-django 找不到设置

    我有一个 Django 项目 使用Celery http pypi python org pypi django celery用于运行异步任务 我正在 Windows XP 计算机上进行开发 启动我的 Django 服务器 python m
  • android ListView不会突出显示所选行

    在我的应用程序中 我从服务器检索用户的播放列表 并感受到ListView与数据 问题是 ListView不突出显示单击的行 为了防止愤怒的评论告诉我我不使用搜索 我尝试过以下方法 将我行中的按钮设置为不可聚焦 通过代码和 XML 设置 li
  • Java 本机接口 (JNI) 是否受 C++ ABI 兼容性问题影响?

    Java 本机接口 JNI 是否受 C ABI 兼容性问题影响 我正在开发一个 Java 应用程序 我想使用 Java 本机接口 JNI 来调用 C 库中的函数 我可以访问 C 库的代码 并且可以根据需要重建它 例如 我可以静态链接 C 运
  • 如何使用现有的 solr 核心数据创建 solr 核心?

    Solr 1 4 企业搜索服务器建议对核心副本进行大量更新 然后将其交换为主核心 我正在执行以下步骤 创建准备核心 执行索引更新 然后在准备核心上提交 优化 交换主核心和预备核心 卸载准备核心 我遇到的问题是 步骤 1 中创建的核心中没有任
  • Enlive 模板 – 添加到头部

    我的应用程序的某些页面将有自己的 js css 包含 所以我想知道如何使用 Enlive 将这些资源添加到 html 文档的头部部分 我发现 append 变压器 但没有不自动转义的 html append 或者什么是正确的方法来做到这一点
  • 污染全局命名空间

    我想这里的大多数 C 程序员都会同意污染全局命名空间是一个坏主意 但是有时这条规则可以被忽略吗 例如 我有一个需要在特定应用程序中使用的类型 我应该这样定义它 mytypes h typedef int MY TYPE foo cpp MY
  • 如何获取表示 Java 对象的序列化字节数?

    我将使用什么语法来获取表示字符串的字节数并将它们与表示字符串的字节数进行比较ArrayList例如 拿着那根绳子 我正在使用多代理代理系统通过消息发送对象 并且我想跟踪每条消息占用的空间 该方法不必非常准确 只要它与对象的实际大小成比例即可