java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化
通常離開內(nèi)存的東西,如果需要存儲或傳輸是需要序列化的,在java中要序列化是要實現(xiàn)Serializable的(或其子類),那不實現(xiàn)Serializable,如何實現(xiàn)一個自定義的序列化呢,我首先想到的是字節(jié)流化。
只要可以把一個對象的內(nèi)容流化到一個字節(jié)數(shù)組中,那么就可以完成序列化操作,為了能夠?qū)崿F(xiàn)反序列化,還要記錄下對象內(nèi)容(類變量)在序列化字節(jié)數(shù)組中的大小和位置,我想到的是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();
}
}
就把這只鳥序列化為字節(jié)數(shù)組,然后將字節(jié)數(shù)組轉(zhuǎn)換為另一只鳥,序列化時按序?qū)ame,age轉(zhuǎn)為字節(jié)數(shù)組,并記錄數(shù)組長度。反序列化時按序讀取字節(jié)數(shù)組,將name,age還原,然后調(diào)用Bird的構(gòu)造方法創(chuàng)建對象。
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);
}
最后驗證下,看下是否可以成功流化,需要注意的是序列化和反序列化其實關(guān)注的只是數(shù)值,顯然反序列化的對象和序列化的不是同一個對象,但是對象的值是相等的。
public static void main(String[] args) {
Bird bird = new Bird("碼農(nóng)小麥",25);
System.out.println(bird);
byte[] bytes = bird.toByte();
Bird sb = bird.fromByte(bytes);
System.out.println(sb);
}
驗證ok,下面就可以使用反射獲取類成員field及value,然后進(jìn)行數(shù)組字節(jié)流化了,反序列化同樣反射調(diào)用構(gòu)造方法即可。
Field[] fields = bird.getClass().getDeclaredFields();
for?(Field field : fields) {
System.out.println(field.getName()+":"+field.get(bird));
}
?著作權(quán)歸作者所有:來自51CTO博客作者mb5fdb0a4002420的原創(chuàng)作品,如需轉(zhuǎn)載,請注明出處,否則將追究法律責(zé)任
總結(jié)
以上是生活随笔為你收集整理的java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 获取spring对象数组_解析
- 下一篇: java判断是否是doc文件_java判