日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通常離開內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。