Java实体类与byte数组相互转换

2023-10-27

1.使用ByteArrayStream 和 ObjectStream

public abstract class ByteConvert {


    public byte[] getByte(){



        try (   ByteArrayOutputStream out =new ByteArrayOutputStream();
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(out)) {

                objectOutputStream.writeObject(this);
                objectOutputStream.flush();
                return out.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    public   <T extends ByteUtil> T getObject(byte[] bytes){

        try(
                ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
                ObjectInputStream b = new ObjectInputStream(byteInputStream)) {

            return (T) b.readObject();



        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null ;
    }

2.使用proto

public abstract class ByteConvert  {


    public byte[] getByte(){
        return ProtostuffUtils.serialize(this);
    }


    public   <T extends ByteUtil> T getObject(byte[] bytes){
        return (T) ProtostuffUtils.deserialize(bytes,this.getClass());
    }


}

ProtostuffUtils

  1. 引入pom
<!--引入protostuff依赖-->
        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.6.0</version>
        </dependency>

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.6.0</version>
        </dependency>

2.编写工具类

public class ProtostuffUtils {
    /**
     * 避免每次序列化都重新申请Buffer空间
     */
    private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
    /**
     * 缓存Schema
     */
    private static Map<Class<?>, Schema<?>> schemaCache = new ConcurrentHashMap<>();

    /**
     * 序列化方法,把指定对象序列化成字节数组
     *
     * @param obj
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> byte[] serialize(T obj) {
        Class<T> clazz = (Class<T>) obj.getClass();
        Schema<T> schema = getSchema(clazz);
        byte[] data;
        try {
            data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
        } finally {
            buffer.clear();
        }

        return data;
    }

    /**
     * 反序列化方法,将字节数组反序列化成指定Class类型
     *
     * @param data
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T deserialize(byte[] data, Class<T> clazz) {
        Schema<T> schema = getSchema(clazz);
        T obj = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(data, obj, schema);
        return obj;
    }

    @SuppressWarnings("unchecked")
    private static <T> Schema<T> getSchema(Class<T> clazz) {
        Schema<T> schema = (Schema<T>) schemaCache.get(clazz);
        if (Objects.isNull(schema)) {
            //这个schema通过RuntimeSchema进行懒创建并缓存
            //所以可以一直调用RuntimeSchema.getSchema(),这个方法是线程安全的
            schema = RuntimeSchema.getSchema(clazz);
            if (Objects.nonNull(schema)) {
                schemaCache.put(clazz, schema);
            }
        }

        return schema;
    }

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

Java实体类与byte数组相互转换 的相关文章

  • 如何向用户提供 Ajax POST 响应作为下载?

    我正在尝试在包含帐户信息的现有页面中包含 vCard 导出功能 丑陋的方法包括 1 向同一页面提交表单 处理它并重新渲染整个页面 或者 2 针对页面上的 iframe 进行 GET 我真的很想避免这两种情况 但我可能必须使用 2 来实现目标
  • 用零向左填充字符串[重复]

    这个问题在这里已经有答案了 我见过类似的问题here https stackoverflow com questions 388461 padding strings in java and here https stackoverflow
  • 正则表达式忽略引号之间的文本

    我有一个正则表达式 它是 s 这用于分割字符串 但我不想让它分开 如果它在引号中 我不会使用 split 而是使用 Pattern 和 Matcher A demo import java util regex Matcher import
  • 在“Java Web 服务教程”之后找不到 taskdef 类 com.sun.tools.ws.ant.WsImport

    我在许多不同的地方看到了同样的问题 即使经过大量谷歌搜索 我也无法解决它 我想做的 更大的图景 是经历Java Web 服务教程 http download oracle com docs cd E17802 01 webservices
  • 从枚举返回计算值

    我的问题有两个而且很简单 按原样误解枚举 这个想法在我的代码中缺少一些重要的抽象 代码示例 其中oprt calc x y 无法编译 有警告cannot find symbol public enum Operation PLUS publ
  • JOOQ初始化DAO最佳方法

    我想知道初始化 JOOQ 生成 DAO 的最佳实践 现在 我使用以下方法来初始化 JOOQ 生成的 DAO 在以下情况下 Student Dao 是 JOOQ 生成的 public class ExtendedStudentDAO exte
  • 请求的操作:声明您的广告 ID 权限

    今天我收到这封电子邮件 去年 7 月 我们宣布了广告政策变更 以帮助加强 安全和隐私 我们对使用的标识符添加了新的限制 针对儿童的应用程序 当用户选择删除他们的 广告 ID 以选择退出个性化广告 如果满足以下条件 开发人员将收到一串零而不是
  • Java 将字符串拆分为单词逗号和句号

    我一直在使用myString split s 得到每个单词 但现在我想把逗号和句号也分开 例如 妈妈总是说生活就像一盒巧克力 你永远不知道会得到什么 to Mama always said life was like a box of ch
  • 我在这个正则表达式中做错了什么?

    我正在做一个关于正则表达式的学校作业 我先解释一下 我必须编写一个正则表达式来检查 URL 我必须检查的条件是 URL 是 http s 还是 ftp s 域名是 nl 还是 edu 至少有一个第三级域名 但如果该域名以 万维网 必须有一个
  • 将 person.city.name 添加到 TableView

    我有一个 TableView 和一些 POJO 并且想要将其中一个属性绑定到 TableView 然而 该属性也是一个 POJO 并且应该有一个属性显示在 TableView 中 这是我的代码
  • 在 DAO 中反映继承关系最有效的方法是什么?

    使用 MVC 结构和业务对象 http en wikipedia org wiki Business object DAO http en wikipedia org wiki Data access object建筑学 对于任何正常的业务
  • itertools.combinations 的矢量化 Numpy (1d) 版本

    我正在尝试完成 itertools combinations 的矢量化 Numpy 版本 我可以进一步用 jit Numba 进行装饰 以使其更快 我不确定这是否可以做到 我正在处理的数据集是一个 1d np array 目标是获得 3 组
  • jQuery - 页面上最宽的项目

    如何使用 jQuery 在网页上找到最宽的项目 在 css 中设置的宽度或作为属性 不会很快 但应该可以解决问题 var widest null each function if widest null widest this else i
  • 使用Optional进行空检查

    我想使用可选实用程序在 JDK8 中执行空检查 这是我正在编写的代码 它给了我一个错误 java util Optional stringToUse java util Optional of childPage getContentRes
  • org.openqa.selenium.remote.service.DriverService$Builder.createArgs()Lcom/google/common/collect/ImmutableList;使用 Selenium 3.5.3

    我正在使用 IntelliJ 编写 Selenium Junit 测试 如果我直接从测试触发 测试运行正常 但是 如果我使用 JunitCore 触发 TestRunnerSuite 的测试 我遇到了以下奇怪的错误 在谷歌研究后我没有找到解
  • Numpy 相当于 if/else 不带循环

    有没有任何Pythonic方法可以删除下面代码中的for循环和if else 此代码迭代 NumPy 数组并检查条件并根据条件更改值 gt gt gt import numpy as np gt gt gt x np random rand
  • 使用Java 8开发的程序可以在Java 7上运行吗?

    我有点困惑 Oracle 表示 Java 8 与 Java 7 向后 高度兼容 但是 Java 8 程序有什么可能性可以在 Java 7 上成功运行 SE EE 呢 如果第一点为真 Java 8 应用程序将在 Java 7 服务器支持上部署
  • Log4j 不打印完整的堆栈跟踪

    我检查了 SO 中的所有答案 但没有一个真正帮助我 我的 Log4j 属性文件 log4j rootLogger debug console file log4j appender console org apache log4j Cons
  • 如何用java实现FTP?

    我正在使用 FTP 我必须在客户端将消息嵌入到图像文件中 并且我必须将其发送到服务器 在服务器端我必须检索图像文件并然后我将检索该消息 我已经完成了嵌入消息并使用密码学和隐写术技术检索消息 我正在寻找如何将该文件从客户端传输到服务器 我必须
  • Jquery 脉动改变颜色或图像

    我正在尝试使用 jquery 脉动代码让 div 改变颜色 但我希望它从红色变为黑色 但我听说要做到这一点 你必须下载某个插件 所以我希望它脉动为图片 到目前为止我有这两个代码 img src 36 gif alt width 105 he

随机推荐