`
yangersoft
  • 浏览: 5416 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java Serializable序列化接口

 
阅读更多
    在这里就简单的说一下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 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    深入探索Java对象的序列化

    深入探索Java对象的序列化 ...一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...

    深入分析Java的序列化与反序列化

     为什么实现了java.io.Serializable接口才能被序列化  transient的作用是什么  怎么自定义序列化策略  自定义的序列化策略是如何被调用的  ArrayList对序列化的实现有什么好处  Java对象的序列化  ...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.3 实施过程 5.3.1 任务一 使用serializable序列化实体对象 5.3.2 任务二 反序列化将Person对象从磁盘上读出 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第9页。 5.3.1 任务一 使用...

    Java中的序列化与反序列化.pdf

    Serializable接口和Externalizable接口实现序列化和反序列化

    Java序列化与反序列化三种格式存取

     一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...

    解析Android中的Serializable序列化

    通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象。 (远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎...

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

    java序列化深度探讨

    对象序列化就是把对象写入到输出流中,用来存储或者传输。 对象的反序列化就是从输入流中读取对象。... 要序列化的对象应该实现Serializable接口。 Serializable接口是一个标识接口,没有抽象方法。

    Java_serialization_doc.rar_Serializable _doc_序列化

    Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络...

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。 和其他序列化工具相比,XStream 有三个...

    xml的序列化与验证

    1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...

    Android中的序列化浅析

    在Android系统中关于序列化的方法一般有两种,分别是实现Serializable接口和Parcelable接口,其中Serializable接口是来自Java中的序列化接口,而Parcelable是Android自带的序列化接口。 上述的两种序列化接口都有各自...

    3分钟读阿里Java手册: 序列化

    前言 下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢?...Java类通过实现Serializable接口实现该类对象的序列化。Java序列化保留了对象类的元数据(类、继承类等),以及对象数据,兼容性好

    JAVA基础,常见java基础问题.rar

    2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID

    java面试题进阶版附答案.docx

    六、序列化和反序列化:解释了Java中序列化和反序列化的概念,以及通过实现Serializable接口进行对象的序列化和反序列化的过程。 七、内部类和匿名类:介绍了Java中的内部类和匿名类的概念,包括不同类型的内部类...

    Android面试专题(七):Serializable 和 Parcelable 的区别

    不诗意的女程序媛不是好厨师~ ...首先,我要强行加个图,哈哈...Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。 Parcelable(androi

    java中的IO操作总结(四)

    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....

    Dubbo服务框架面试题及答案.pdf

    Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数 据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。 多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 ...

Global site tag (gtag.js) - Google Analytics