java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化
通常离开内存的东西,如果需要存储或传输是需要序列化的,在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】面试官问我,如何实现一个自定义序列化相关推荐
- java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...
在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...
- eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...
文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...
- 岗位理解_当面试官问求职者对应聘岗位的理解情况
虽然求职是看的是岗责是否匹配自己的经历和能力,但是很多面试官还是会问这样的问题.对于求职者来说,对岗位的理解其实就是把岗位职责背一遍,但是面试官既然问了,就要说出一些其他内容来.想回答好这个问题,就要 ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- websphere mq 查看队列中是否有数据_如果面试官再问你消息队列,就把这篇甩给他!...
★★★建议星标我们★★★ 公众号改版后文章乱序推荐,希望你可以点击上方"Java进阶架构师",点击右上角,将我们设为★"星标"!这样才不会错过每日进阶架构文章呀 ...
- cms是什么意思啊_美团面试官问我:ZGC 的 Z 是什么意思?
本文的阅读有一定的门槛,请先了解 GC 的基本知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来 ...
- JAVA中堆和栈的区别[面试常问点一]
概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...
- java中的感叹号是_[Java教程]javascript中的2个感叹号的用法
[Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...
- java中math.ceil用法_[Java教程]关于Math类的round、floor、ceil三个方法
[Java教程]关于Math类的round.floor.ceil三个方法 0 2014-05-06 16:00:08 一.Math类这三个方法的简介 1.round():取最接近的值. 对于这个方法, ...
- java中删除node节点_[Java]LeetCode237. 删除链表中的节点 | Delete Node in a Linked List
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
最新文章
- Boost:BOOST_ASSERT_IS_VOID的测试程序
- p标题/p能设置字体的大小和颜色
- java项目引入json配置,TS-28 配置tsconfig.json(3):工程引用
- SIMD 编程的优势与SIMD指令:SSE/AVX 与编程demo
- 相机模型与标定(一)--相机标定概述
- 原生js之同级元素添加移除class
- 正则表达式常用的js验证
- 十次方项目 请仔细查看
- OCR应用场景:票总管发票管理系统
- 贪吃蛇c加加代码_c语言贪吃蛇代码
- C#.NET生成条形码(Code39和Code128)
- python初学:expected an indented block 报错
- H5新增音频标签-audio
- BLE 配对流程梳理
- IP 地址以 0 开头会降维成八进制
- docker 安装Mysql并设置自启动
- 扎拉赞恩 服务器 微信群,魔兽8.0剧透 回归的扎拉赞恩与沃金的骨灰
- 《赐我》-一只白羊 同步歌词
- 说一说用户思维!!!
- IE浏览器打不开jupyter notebook网页的解决办法
热门文章
- Google: 如何做code review?
- Electron通过ffi调用DLL
- 深度学习框架Neon
- linux最大文件句柄数量总结
- Centos: 解决系统编码 locale 的报错 LC_CTYPE / LC_ALL 问题
- 大剑无锋之TCP和HTTP的区别【面试推荐】
- java小编程---生成不重复的随机数列
- Java位操作:如何将long类型的指定位设置为0或1?How to set/unset a bit at specific position of a long?
- 【Servlet】Filter过滤器详解、使用示例
- 怎么在java中创建一个自定义的collector