在这里就简单的说一下Serializable接口,主要是在使用Findbugs插件来检查代码bug时,发现大篇幅的报Non-transient non-serializable instance field in serializable class错误。在仔细研究了下后,找到了解决方法,在这里分享一下
结论:
1、如果要可序列化某个类,需要实现Serializable接口
2、为确保序列化与反序列化一致,UID必须不可改变
3、如果不需要序列化成员变量,那么可以将这个变量标为瞬时的,修饰符:transient
4、如果需要序列化成员变量的引用,那么这个引用也需要实Serializable接口
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 本例子是将一个类持久化到硬盘中,然后再反序列化出这个对象。
* 当然如果需要在网络上传输的对象,也需要实现Serializable接口,比如RMI远程方法调用
*/
public class TestSerializable
{
//对象持久化地址
private final static String FILE_PATH = "D://student";
public static void main(String[] args)
{
writeObj();
readObj();
}
//将对象持久化到硬盘
public static void writeObj()
{
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try
{
Student stu1 = new Student(17, "Tom", new Point(108, 230));
System.out.println("stu1: " + stu1);
fos = new FileOutputStream(FILE_PATH);
oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.flush();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (oos != null)
{
try
{
oos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (fos != null)
{
try
{
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
//反序列持久化对象
public static void readObj()
{
FileInputStream fis = null;
ObjectInputStream ois = null;
try
{
Student stu2 = null;
fis = new FileInputStream(FILE_PATH);
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
stu2 = (Student) obj;
System.out.println("stu2: " + stu2);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
finally
{
if(ois != null)
{
try
{
ois.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if(fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
//如果要可序列化某个类,需要实现Serializable接口
class Student implements Serializable
{
//为确保序列化与反序列化一致,UID必须不可改变
private static final long serialVersionUID = 1L;
private String name;
private int age;
//如果不需要序列化成员变量,那么可以将这个变量标为瞬时的,修饰符:transient
//private transient Point point;
//如果需要序列化成员变量的引用,那么这个引用也需要实Serializable接口
private Point point;
public Student(int age, String name, Point point)
{
this.age = age;
this.name = name;
this.point = point;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Point getPoint()
{
return point;
}
public void setPoint(Point point)
{
this.point = point;
}
@Override
public String toString()
{
return "name=" + this.getName() + ", age=" + this.getAge() + ", point{"
+ this.getPoint() + "}";
}
}
class Point implements Serializable
{
private static final long serialVersionUID = 1L;
private int x;
private int y;
public Point(int x, int y)
{
super();
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
@Override
public String toString()
{
return "x=" + x + ", y=" + y;
}
}
分享到:
相关推荐
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
深入探索Java对象的序列化 ...一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:
通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...
为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列化策略 自定义的序列化策略是如何被调用的 ArrayList对序列化的实现有什么好处 Java对象的序列化 ...
5.3 实施过程 5.3.1 任务一 使用serializable序列化实体对象 5.3.2 任务二 反序列化将Person对象从磁盘上读出 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第9页。 5.3.1 任务一 使用...
Serializable接口和Externalizable接口实现序列化和反序列化
一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...
通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象。 (远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎...
最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...
对象序列化就是把对象写入到输出流中,用来存储或者传输。 对象的反序列化就是从输入流中读取对象。... 要序列化的对象应该实现Serializable接口。 Serializable接口是一个标识接口,没有抽象方法。
Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络...
使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。 和其他序列化工具相比,XStream 有三个...
1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...
在Android系统中关于序列化的方法一般有两种,分别是实现Serializable接口和Parcelable接口,其中Serializable接口是来自Java中的序列化接口,而Parcelable是Android自带的序列化接口。 上述的两种序列化接口都有各自...
前言 下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢?...Java类通过实现Serializable接口实现该类对象的序列化。Java序列化保留了对象类的元数据(类、继承类等),以及对象数据,兼容性好
2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID
六、序列化和反序列化:解释了Java中序列化和反序列化的概念,以及通过实现Serializable接口进行对象的序列化和反序列化的过程。 七、内部类和匿名类:介绍了Java中的内部类和匿名类的概念,包括不同类型的内部类...
不诗意的女程序媛不是好厨师~ ...首先,我要强行加个图,哈哈...Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。 Parcelable(androi
Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import java.io....
Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数 据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。 多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 ...