如何获取表示 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 对象的序列化字节数? 的相关文章

  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 实现与扩展:何时使用?有什么不同?

    请用易于理解的语言进行解释或提供某些文章的链接 extends is for 延伸一类 implements is for 实施一个接口 接口和常规类之间的区别在于 在接口中您不能实现任何声明的方法 只有 实现 接口的类才能实现方法 C 中
  • 在 IntelliJ 上进行 Google App Engine Java 开发?

    令人烦恼的是 Google App Engine 已成为其中的另一个项目 他们只发布 Eclipse 插件 如 Spring Webflow 而我更喜欢 IntelliJ 你能用IntelliJ成功运行本地测试环境吗 并调试 部署本地或实时
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 如何识别 Java 中的不可变对象

    在我的代码中 我正在创建一个对象集合 这些对象将由各种线程以只有在对象不可变的情况下才安全的方式访问 当尝试将新对象插入到我的集合中时 我想测试它是否是不可变的 如果不是 我将抛出异常 我能做的一件事是检查一些众所周知的不可变类型 priv
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei

随机推荐

  • 为什么 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例如 拿着那根绳子 我正在使用多代理代理系统通过消息发送对象 并且我想跟踪每条消息占用的空间 该方法不必非常准确 只要它与对象的实际大小成比例即可