`
yangersoft
  • 浏览: 5653 次
  • 性别: 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 serializable 序列化与反序列化

    `Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,它的实例就可以被序列化。 **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换...

    java序列化(Serializable)的作用和反序列化.doc

    在Java中,通过实现`Serializable`接口,可以方便地进行对象的序列化操作。序列化的核心在于能够将对象的状态转换为可以存储或传输的形式,从而实现对象的持久化和远程通信等功能。 #### 二、序列化的应用场景 ...

    java.io.Serializable序列化问题

    序列化的核心接口是 `java.io.Serializable`,它是一个标记接口,没有定义任何方法,用于标记可以被序列化的类。 #### 二、实现序列化的方法 为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这...

    Java_Serializable(序列化)的理解和总结

    在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被序列化。序列化的目的是为了能够持久地保存对象的状态,或者在网络中传递对象。 序列化主要关注的是对象的状态(即其实例变量),而不是其...

    java序列化和反序列化的方法

    在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...

    可序列化接口Serializable

    当你在一个类上声明实现了这个接口,你实际上是在告诉JVM(Java虚拟机)该类的对象可以被序列化。序列化是指将对象的状态转换为字节流的过程,这使得对象可以在网络上传输或保存到磁盘上,以便稍后恢复其状态。 **...

    java反序列化利用程序UI版Beta1.1.rar

    1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...

    Java 文件 序列化 读写

    2. **序列化接口**: - 在Java中,如果一个类想要实现序列化,只需实现`Serializable`接口即可,但该接口没有任何方法,只是一个标志接口。 3. **序列化过程**: - 使用`ObjectOutputStream`类的`writeObject()`...

    C#和Java的序列化反序列化

    而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...

    java自动序列化

    通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象支持序列化。 二、为什么需要Java序列化 1. 持久化:序列化可以将对象状态持久化到磁盘,以便下次...

    析Android中的Serializable序列化.rar_Serializable _android

    本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意事项。 一、Serializable接口概述 Serializable接口是Java提供的一种序列化机制,它允许对象的状态被转换成字节流,以便于存储或者...

    java对象序列化和反序列化

    2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....

    Java序列化_Java序列化结构_

    Java中的序列化主要通过实现`java.io.Serializable`接口来完成。虽然这个接口没有任何方法,但是它的存在就表明该类的对象可以被序列化。当一个对象被序列化时,其所有字段(包括私有的)都会被包含在字节流中,除非...

    Java对象序列化标准最新版

    ### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...

    Java序列化

    2. **序列化接口** - `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化...

    Serializable序列化

    **Serializable序列化** 在Java编程语言中,`Serializable`接口是一个非常重要的概念,它涉及到对象的状态持久化和网络传输。序列化是将一个对象转换为字节流的过程,这样就可以将其保存到磁盘、数据库或者在网络中...

    java 对象的序列化与反序列化

    要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,没有包含任何方法,只是表明该类的对象是可以被序列化的。 下面是一些关于序列化的重要知识点: 1. **序列化标识符...

    Java对象Serializable接口实现详解

    Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。 Serializable...

    java对象序列化.ppt

    要实现对象序列化,Java类必须实现`Serializable`接口或`Externalizable`接口。`Serializable`接口是一个空接口,当一个类实现它时,表明该类的所有实例都可以被序列化。而`Externalizable`接口提供了更多的控制权,...

Global site tag (gtag.js) - Google Analytics