通常离开内存的东西,如果需要存储或传输是需要序列化的,在java中要序列化是要实现Serializable的(或其子类),那不实现Serializable,如何实现一个自定义的序列化呢,我首先想到的是字节流化。

只要可以把一个对象的内容流化到一个字节数组中,那么就可以完成序列化操作,为了能够实现反序列化,还要记录下对象内容(类变量)在序列化字节数组中的大小和位置,我想到的是ByteBuffer,就靠它了。

public class Bird {

private String name;

private int age;

public Bird(String name, int age) {

this.name = name;

this.age = age;

}

@Override

public String toString() {

final StringBuilder sb =

new StringBuilder("Bird{");

sb.append("name='").append(name).append(''');

sb.append(", age=").append(age);

sb.append('}');

return sb.toString();

}

}

就把这只鸟序列化为字节数组,然后将字节数组转换为另一只鸟,序列化时按序将name,age转为字节数组,并记录数组长度。反序列化时按序读取字节数组,将name,age还原,然后调用Bird的构造方法创建对象。

public byte[] toByte() {

ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

byte[] names = this.name.getBytes();

byteBuffer.putInt(names.length);

byteBuffer.put(names);

byteBuffer.putInt(age);

returnbyteBuffer.array();

}

public Bird fromByte(byte[] bytes) {

ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length);

byteBuffer.put(bytes);

byteBuffer.flip();

int length = byteBuffer.getInt();

byte[] tmpbytes = new byte[length];

byteBuffer.get(tmpbytes);

String name = new String(tmpbytes);

int age = byteBuffer.getInt();

return new Bird(name, age);

}

最后验证下,看下是否可以成功流化,需要注意的是序列化和反序列化其实关注的只是数值,显然反序列化的对象和序列化的不是同一个对象,但是对象的值是相等的。

public static void main(String[] args) {

Bird bird = new Bird("码农小麦",25);

System.out.println(bird);

byte[] bytes = bird.toByte();

Bird sb = bird.fromByte(bytes);

System.out.println(sb);

}

验证ok,下面就可以使用反射获取类成员field及value,然后进行数组字节流化了,反序列化同样反射调用构造方法即可。

Field[] fields = bird.getClass().getDeclaredFields();

for (Field field : fields) {

System.out.println(field.getName()+":"+field.get(bird));

}

©著作权归作者所有:来自51CTO博客作者mb5fdb0a4002420的原创作品,如需转载,请注明出处,否则将追究法律责任

java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化相关推荐

  1. java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

  2. eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...

    文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...

  3. 岗位理解_当面试官问求职者对应聘岗位的理解情况

    虽然求职是看的是岗责是否匹配自己的经历和能力,但是很多面试官还是会问这样的问题.对于求职者来说,对岗位的理解其实就是把岗位职责背一遍,但是面试官既然问了,就要说出一些其他内容来.想回答好这个问题,就要 ...

  4. java中字符串的创建_【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  5. websphere mq 查看队列中是否有数据_如果面试官再问你消息队列,就把这篇甩给他!...

    ★★★建议星标我们★★★ 公众号改版后文章乱序推荐,希望你可以点击上方"Java进阶架构师",点击右上角,将我们设为★"星标"!这样才不会错过每日进阶架构文章呀 ...

  6. cms是什么意思啊_美团面试官问我:ZGC 的 Z 是什么意思?

    本文的阅读有一定的门槛,请先了解 GC 的基本知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来 ...

  7. JAVA中堆和栈的区别[面试常问点一]

    概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...

  8. java中的感叹号是_[Java教程]javascript中的2个感叹号的用法

    [Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...

  9. java中math.ceil用法_[Java教程]关于Math类的round、floor、ceil三个方法

    [Java教程]关于Math类的round.floor.ceil三个方法 0 2014-05-06 16:00:08 一.Math类这三个方法的简介 1.round():取最接近的值. 对于这个方法, ...

  10. java中删除node节点_[Java]LeetCode237. 删除链表中的节点 | Delete Node in a Linked List

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. Boost:BOOST_ASSERT_IS_VOID的测试程序
  2. p标题/p能设置字体的大小和颜色
  3. java项目引入json配置,TS-28 配置tsconfig.json(3):工程引用
  4. SIMD 编程的优势与SIMD指令:SSE/AVX 与编程demo
  5. 相机模型与标定(一)--相机标定概述
  6. 原生js之同级元素添加移除class
  7. 正则表达式常用的js验证
  8. 十次方项目 请仔细查看
  9. OCR应用场景:票总管发票管理系统
  10. 贪吃蛇c加加代码_c语言贪吃蛇代码
  11. C#.NET生成条形码(Code39和Code128)
  12. python初学:expected an indented block 报错
  13. H5新增音频标签-audio
  14. BLE 配对流程梳理
  15. IP 地址以 0 开头会降维成八进制
  16. docker 安装Mysql并设置自启动
  17. 扎拉赞恩 服务器 微信群,魔兽8.0剧透 回归的扎拉赞恩与沃金的骨灰
  18. 《赐我》-一只白羊 同步歌词
  19. 说一说用户思维!!!
  20. IE浏览器打不开jupyter notebook网页的解决办法

热门文章

  1. Google: 如何做code review?
  2. Electron通过ffi调用DLL
  3. 深度学习框架Neon
  4. linux最大文件句柄数量总结
  5. Centos: 解决系统编码 locale 的报错 LC_CTYPE / LC_ALL 问题
  6. 大剑无锋之TCP和HTTP的区别【面试推荐】
  7. java小编程---生成不重复的随机数列
  8. Java位操作:如何将long类型的指定位设置为0或1?How to set/unset a bit at specific position of a long?
  9. 【Servlet】Filter过滤器详解、使用示例
  10. 怎么在java中创建一个自定义的collector