首页 > 作文

Java序列化和反序列化示例介绍

更新时间:2023-04-04 10:29:58 阅读: 评论:0

以前用序列化都是一些方法需要才实现的,后来业务需求要深拷贝才去研究。参阅了别人博客得出一些总结。

序列化是为了把java对象转化为字节序列(字节流)的过程。然后深拷贝是通过对流的操作来实现的,序列化后数据方便存储传输。反序列化则是把字节序列反序列化为java对象

存储方便:因为对象会被回收,序列化后可以持续化存储在磁盘中
传输方便:字节序列(二进制形式)可以进行网络传输和传播。

最好设置一个rialversionuid,因为序列化和反序列化是对比rialversionuid来进行的,虽然不设置接口也会默认生成一个,但是要知道序列化对象过程一般都是对象->序列化->存储或传输->反序列化。
举个例子:
先创建一个实体类student

import lombok.data;import java.io.rializable;@datapublic class student implements rializable {    private integer id;    private string name;    private string x;}
然后创建一个测试类rializabletest
import rialization.entity.student;import java.io.*;public class rializabletest {    public static void main(string[] args) throws exception {        rializestudent();        student student = derializestudent();        system.out.println("name:" + student.getname());        system.out.println("x:" + student.getx());    }    private static void rializestudent() throws ioexception {        student student = new student();        student.tid(1);        student.tname("张三");        student.tx("male");        objectoutputstream out = new objectoutputstream(new fileoutputstream(                new file("f:/student.txt")));        out.writeobject(student);        system.out.println("序列化成功");        out.clo();    }    private static student derializestudent() throws exception {        objectinputstream in = new objectinputstream(new fileinputstream(new file("f:/student.txt")));        student student = (student) in.readobject();        system.out.println("反序列化成功");        return student;    }}
执行结果:
序列化成功反序列化成功name:张三x:male
这个时候没有指定rialversionuid也是可以成功的,但对象->序列化->存储或传输->反序列化,咱们在反序列化操作之前对student类修改呢?

这个时候咱们修改一下代码,先注释掉反序列化代码,先进行序列化。

import rialization.entity.student;import java.io.*;public class rializabletest {    public static void main(st漂亮的母亲节贺卡手工ring[] args) throws exception {        rializestudent();//        student student = derializestudent();//        system.out.println("name:" + student.getname());//        system.out.println("x:" + student.getx());    }    private static void rializestudent() throws ioexception {        student student = new student();        student.tid(1);        student.tname("张三");        student.tx("male");        objectoutputstream out = new objec过年回家给父母带什么toutputstream(new fileoutputstream(                new file("f:/student.txt")));        out.writeobject(student);        system.out.println("序列化成功");        out.clo();    }//    private static student derializestudent() throws exception {//        objectinputstream in = new objectinputstream(new fileinputstream(new file("f:/student.txt")));//        student student = (student) in.readobject();//        system.out.println("反序列化成功");//        return student;//    }幼儿园年度工作总结}
运行结果:
序列化成功

修改student类

import lombok.data;import java.io.rializable;@datapublic class student implements rializable {    private integer id;    private string name;    private string x;    private string address;}
注释掉序列化方法,进行反序列化
import rialization.entity.student;import java.io.*;public class rializabletest {    public static void main(string[] args) throws exception {//        rializestudent();        student student = derializestudent();        system.out.println("na厦门槟榔中学me:" + student.getname());        system.out.println("x:" + student.getx());    }//    private static void rializestudent() throws ioexception {//        student student = new student();//        student.tid(1);//        student.tname("张三");//        student.tx("male");////        objectoutputstream out = new objectoutputstream(new fileoutputstream(//                new file("f:/student.txt")));//        out.writeobject(student);//        system.out.println("序列化成功");//        out.clo();//    }    private static student derializestudent() throws exception {        objectinputstream in = new objectinputstream(new fileinputstream(new file("f:/student.txt")));        student student = (student) in.readobject();        system.out.println("反序列化成功");        return student;    }}
执行结果:
exception in thread "main" java.io.invalidclasxception: rialization.entity.student; local class incompatible: stream classdesc rialversionuid = 3846952599709361171, local class rialversionuid = -4606152942663467236at java.io.objectstreamclass.initnonproxy(objectstreamclass.java:699)at java.io.objectinputstream.readnonproxydesc(objectinputstream.java:1885)at java.io.objectinputstream.readclassdesc(objectinputstream.java:1751)at java.io.objectinputstream.readordinaryobject(objectinputstream.java:2042)at java.io.objectinputstream.readobject0(objectinputstream.java:1573)at java.io.objectinputstream.readobject(objectinputstream.java:431)at rialization.demo.rializabletest.derializestudent(rializabletest.java:30)at rialization.demo.rializabletest.main(rializabletest.java:10)process finished with exit code 1
可以看出两次的执行的rialversionuid不匹配,导致产生java.io.invalidclasxception异常,所以只要指定了rialversionuid就不会报异常。
//指定rialversionuid正确写法private static final long rialversionuid = 3846952599709361171l;//如果已经进行序列化了不知道rialversionuid,可以通过反射获取object obj = student.class.newinstance();field field = student.class.getdeclaredfield("rialversionuid");field.tac巧克力味的暑假cessible(true);system.out.println(field.getlong(obj));

最后需要知道的一点就是字节流字符流的区别。
字节流:传输过程中,传输数据的最基本单位是字节的流。
字符流:传输过程中,传输数据的最基本单位是字符的流。

这样讲可能有点不知所云,字节其实就是java的八大基本类型byte(比特)单位,而字符通常是’a’、‘b’、’$’、’&’等,字节大小则取决于你是什么编码(环境),如下:

ascii 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。

utf-8 编码中,一个英文字为一个字节,一个中文为三个字节。

unicode 编码中,一个英文为一个字节,一个中文为两个字节。

符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。

占2个字节的大小。utf-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(unicode 扩展区的一些汉字存储需要 4 个字节)。

utf-32 编码中,世界上任何字符的存储都需要 4 个字节。

到此这篇关于java序列化和反序列化示例介绍的文章就介绍到这了,更多相关java序列化内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 10:29:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/c8af9b065d7654f3384a9ed3f811c8e8.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java序列化和反序列化示例介绍.doc

本文 PDF 下载地址:Java序列化和反序列化示例介绍.pdf

标签:序列化   字节   字符   中文
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图