`

Serializable

阅读更多
Serializable


一、Serializable

1.源码
// 一个空的接口
public interface Serializable {
}


2.目的

是对象变为字节序列,保存对象的状态(即当前对象的成员变量的赋值),随时可以恢复回原来的对象。

3.
应用: 将数据输出到文本,再从文本中读取数据;机器间传输数据,保证接收方可以读取接收方的数据。

4.实现 Serializable

implements Serializable

eclispe 等 IDE 会有 warning 提示,IDE 提供两种接口的实现方式

一个是默认的1L:
private static final long serialVersionUID = 1L;


一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段:
private static final   long     serialVersionUID = xxxxL;


5.其他:不想序列化某个属性
a.transient 修饰,表示某个属性是临时的,不需要反序列化的值
b.static 修饰,表示某个属性是类所有的,而不是对象独有的,反序列化时取得值为类中修饰的对应的值,而不是对象中进行的赋值

二、代码实现


package com.study.rpc.ser.day.one;

import java.io.Serializable;

public class Person implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -1170943594852852868L;
	private String name ;
	/**
	 * 若某个属性保密,不希望进行系列化处理,加关键字,transient 
	 */
	private transient Integer age ;
	private String gender ;
	
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}
	public Person(String name, Integer age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
}

package com.study.rpc.ser.day.one;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.junit.Test;

public class SerializableDemo {
	
	
	/**
	 * 序列化:将对象以二进制的格式输出到文本文件中
	 * @throws IOException
	 */
	@Test
	public void testSerializable() throws IOException{
		/**
		 * 所有需要序列化的类均需要实现 Serializable 接口
		 * 标记接口,标识  此类允许序列化与反序列化
		 * java.io.NotSerializableException
		 */
		Person person = new Person();
		person.setName("zhang");
		person.setAge(Integer.valueOf(26));
		person.setGender("male");
		// 序列化输出:文件内容为二进制格式,无法直接阅读
		FileOutputStream out = new FileOutputStream("D:\\study\\test.txt");
		ObjectOutputStream oos = new ObjectOutputStream(out);
		
		oos.writeObject(person);
		oos.flush();
		oos.close();
		
	}

	/**
	 * 反序列化:读取文本中的二进制信息
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	@Test
	public void testReverseSerializable() throws IOException, ClassNotFoundException{
		
		FileInputStream in = new FileInputStream("D:\\study\\test.txt");
		ObjectInputStream ois = new ObjectInputStream(in);
		Person person = (Person) ois.readObject();
		System.out.println(person.getName()+" "+person.getAge()+" "+person.getGender());
	}
}




1.执行testSerializable后

修改 test.txt 中的属性内容,减少或增加成员变量

修改 serialVersionUID   的内容

2.执行testReverseSerializable 会出现如下异常提示

java.io.InvalidClassException: com.study.rpc.ser.day.one.Person; local class incompatible: stream classdesc serialVersionUID = -1170943594852852868, local class serialVersionUID = -117094359485285

3.serialVersionUID  字段用于标识当前序列化类的版本号


三、参考资料:
java对象实现Serializable接口
    
分享到:
评论

相关推荐

    Serializable在C#中的作用.NET 中的对象序列化

    ### C#中Serializable的作用与对象序列化详解 #### 一、引言 在现代软件开发中,特别是基于.NET框架的应用程序开发中,对象序列化是一项非常重要的技术。它允许将对象的状态转换为一种持久的形式(如文件或网络传输...

    轉Serializable至Stream

    在Java编程中,`Serializable`接口是用于对象序列化的重要工具。对象序列化是指将一个对象的状态转换为字节流的过程,以便存储或通过网络进行传输。另一方面,`Stream`通常指的是I/O流,它是Java处理输入/输出数据的...

    Intent传递对象Serializable

    本教程将详细讲解如何通过Serializable接口来实现Intent对象的传递。 首先,了解Serializable接口。在Java中,Serializable是用于序列化和反序列化的接口。当一个类实现了这个接口,它的实例就可以被转化为一串字节...

    序列化 serializable demo

    例如,`MySerializable.java`和`Product.java`两个文件可能分别代表实现了`Serializable`接口的类。`MySerializable`可能是自定义的一个示例类,而`Product`可能是表示产品的类,它们都包含了可序列化的属性。 在`...

    Android序列化——Serializable与Parcelable

    本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...

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

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java.io.Serializable序列化问题

    ### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...

    bundle传递基本数据,Parcelable类型数据,Serializable类型数据

    本篇将详细介绍如何通过`Bundle` 传递基本数据类型、Parcelable类型数据以及Serializable类型数据。 ### 一、基本数据类型的传递 在Android中,基本数据类型包括int、boolean、float、double、char等。通过`put()`...

    Laravel开发-serializable-values

    在Laravel框架中,"serializable-values"是一个关键概念,它涉及到对象的序列化与反序列化,这对于数据存储和传输至关重要。在这个话题下,我们将深入探讨Laravel如何处理可序列化的值,以及如何利用Luminark提供的...

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

    ### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...

    [Serializable]在C_中的作用-NET_中的对象序列化

    【Serializable]在C#中的作用主要涉及到.NET框架中的对象序列化技术。对象序列化是将一个对象的状态转换为可存储或可传输的形式的过程,而[Serializable]是C#中用于标记一个类,表明该类的对象可以被序列化的特性。...

    可序列化接口Serializable

    在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...

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

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    java serializable 序列化与反序列化

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

    Serializable的增删改查

    Serializable的增删改查操作,已经经过验证,可以直接运行。

    java->serializable深入了解

    java->serializable深入了解 java->serializable深入了解 java->serializable深入了解

    Serializable java序列号

    在Java中,如果一个类需要支持序列化,那么该类需要实现`java.io.Serializable`接口,虽然这个接口没有定义任何方法,但是它的存在作为一个标记,表明该类的对象可以被序列化。 序列化的优点主要有以下几点: 1. **...

    java对象序列化Demo------------Serializable

    java 序列化 对象 Serializable 写着玩的Demo 简单 实用

    析Android中的Serializable序列化.rar_Serializable _android

    在Android开发中,Serializable接口是实现对象序列化的重要方式,它是Java平台标准的一部分,但在Android环境中也有广泛的应用。本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意...

Global site tag (gtag.js) - Google Analytics