`

java.io.Serializable

    博客分类:
  • Java
 
阅读更多

<!-- Generated by javadoc (build 1.5.0_03) on Mon May 29 11:19:21 CST 2006 -->

<noscript></noscript>

JAVADOC摘录:类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

仅在子类型扩展的类有一个可访问的无参数构造方法 来初始化该类的状态时,才可以假定子类型有此责任。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。

 

<!-- Generated by javadoc (build 1.5.0_03) on Mon May 29 11:19:21 CST 2006 -->

<noscript></noscript>

在序列化和反序列化过程中需要特殊处理 的类必须使用下列准确签名来实现特殊方法:

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

 

<!-- Generated by javadoc (build 1.5.0_03) on Mon May 29 11:19:21 CST 2006 -->

<noscript></noscript>

将对象写入流时需要指定要使用的替代对象的可序列化类 ,应使用准确的签名来实现此特殊方法:

 ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
 

此 writeReplace 方法将由序列化调用,前提是如果此方法存在,而且它可以通过被序列化对象的类中定义的一个方法访问。因此,该方法可以拥有私有 (private)、受保护的 (protected) 和包私有 (package-private) 访问。子类对此方法的访问遵循 java 访问规则。

在从流中读取类的一个实例时需要指定替代的类应使用的准确签名来实现此特殊方法。

 ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
 

此 readResolve 方法遵循与 writeReplace 相同的调用规则和访问规则。

 

 

<!-- Generated by javadoc (build 1.5.0_03) on Mon May 29 11:19:21 CST 2006 -->

<noscript></noscript>

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException 。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:

 

主要知识点:

 

1.序列化要实现此接口

2.可以通过writeObject,readObject实现自定义的序列化

3.可以通过writeReplace,readResolve替换序列化方法

 

package com.sunrain.serialize;

import java.io.*;
import java.io.ObjectInputStream.GetField;
import java.io.ObjectOutputStream.*;

public class Person implements  Serializable{
	private  String name;
	private  int  age;
	private  boolean sex;
	public Person(String name){
		this.name = name;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}
	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;
	}
	
	@Override
	public String toString() {
		return "name:"+name+";\nage="+age+";\nsex="+sex;
	}
	
	 private void writeObject(ObjectOutputStream out) {  
         try {  
             PutField field = out.putFields();  
             field.put("name", name);  
             System.out.println("加密前: name = " + name);  
             // 模拟加密  
             name = name + "1";  
             field.put("name", name);  
             out.writeFields();  
         } catch (IOException e) {  
             e.printStackTrace();  
         }  
   
     }  
   
     private void readObject(ObjectInputStream in) {  
         try {  
             GetField field = in.readFields();  
             name = (String) field.get("name", "");  
             System.out.println("读取的原始name = " + name);  
             // 模拟解密  
             name = name.substring(0, name.length() - 1);  
             System.out.println("解密后的name = " + name);  
         } catch (Exception e) {  
             e.printStackTrace();  
         }  
     }  
     
     
     Object writeReplace() throws ObjectStreamException{
    	 return new Person("ttandzz");
     }
     
     Object readResolve() throws ObjectStreamException{
    	 return new Person("and");
     }
}

 

package com.sunrain.serialize;

import java.io.Serializable;

public class Man extends Person implements Serializable {
	public Man(String name) {
		super(name);
	}

	private static final long serialVersionUID = 1L;
	
	@Override
	public String toString() {
		return super.toString();
	}
	
}

 

package com.sunrain.serialize;

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

public class SerializeTest {

	/**
	 * @Description: 
	 * @param args
	 * @return void  
	 * create by sunrain on 2011-10-30
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Man p = new Man("nnn");
		p.setAge(10);
		p.setName("zzz");
		p.setSex(true);
		
		ObjectOutputStream  o = new ObjectOutputStream(new FileOutputStream("t.tmp"));
		o.writeObject(p);
		o.close();
		
		ObjectInputStream   i = new ObjectInputStream(new FileInputStream("t.tmp"));
		Person m = (Person) i.readObject();
		System.out.println(m.toString());
	}

}
 

 

 

 

分享到:
评论

相关推荐

    java.io.Serializable序列化问题

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

    java.io.InvalidClassException local class incompatible 处理方法

    ### Java.io.InvalidClassException Local Class Incompatible 解决方案 在Java序列化过程中,经常会遇到`java.io.InvalidClassException`异常,特别是在序列化类时如果类的版本与反序列化环境中的类版本不一致的...

    stuts2.2_API文档

    java.lang.Throwable (implements java.io.Serializable) java.lang.Exception java.lang.RuntimeException com.opensymphony.xwork2.XWorkException (implements com.opensymphony.xwork2.util.location.Locatable...

    最最常用的 100 个 Java类分享

    24. `java.io.Serializable`:Serializable接口用于对象序列化,允许对象的状态被保存和恢复。 25. `java.util.LinkedList`:LinkedList是双向链表实现的List,适合频繁插入和删除操作。 26. `java.text....

    Java-IO.rar_java IO

    这个过程涉及到`java.io.Serializable`接口,任何需要被序列化的类都必须实现这个接口。以下是一个简单的序列化和反序列化的例子: ```java import java.io.*; class Student implements Serializable { String ...

    JBuider第八章:Java.io包.rar

    Java.io包支持对象的序列化和反序列化,通过实现`Serializable`接口,可以将对象转换为字节流,便于存储或网络传输。 7. **文件操作**: `File` 类是文件和目录操作的主要接口,可以创建、删除、重命名文件和目录...

    java中的IO操作总结(四)

    import java.io.Serializable; @SuppressWarnings("serial") //一个类要想实现序列化则必须实现Serializable接口 class Person implements Serializable { private String name; private int age; public ...

    java 中序列化NotSerializableException问题解决办法

    NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不implement Serializable 接口的对象时。今天,我们将讨论 Java 中序列化 NotSerializableException 问题的解决办法。 问题描述 --------...

    spring4.0 API

    java.util.HashMap,V&gt; (implements java.lang.Cloneable, java.util.Map,V&gt;, java.io.Serializable) java.util.LinkedHashMap,V&gt; (implements java.util.Map,V&gt;) org.springframework.core.annotation....

    Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】

    本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类。...import java.io.Serializable; import android.app.Activity; import android.content.Context; import android.content.Intent; import andr

    java.beans.*

    `java.io.Serializable` 接口是实现序列化的基础。Android 中,虽然不常用 Java Beans 的序列化,但仍然可以使用这个机制来保存对象状态。 6. **Introspection**: `java.beans.Introspector` 类提供了一种动态分析 ...

    xml_programming_in_java.rar_XML java_java programming_xml how to

    Java的`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`可以配合`java.io.Serializable`接口实现对象的序列化和反序列化,而`javax.xml.bind.JAXBContext`和`javax.xml.bind.Marshaller`等类可以实现XML...

    JavaSE-day12每日作业卷2

    - **对象的序列化**:为了保存对象到文件,对象必须实现`java.io.Serializable`接口。创建一个对象输出流(`ObjectOutputStream`),通过它将对象写入文件。 - **对象的反序列化**:使用`ObjectInputStream`从文件...

    JavaAPI(官方英文版)

    例如,`java.util.Comparator`接口用于比较对象,而`java.io.Serializable`接口则表示类可以被序列化。 4. **枚举(Enum)**:Java允许定义枚举类型,这是一种特殊的类,可以有预定义的实例。比如`java.util....

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

    import java.io.Serializable; public class Box implements Serializable { private static final long serialVersionUID = 1L; private int width; private int height; private String name; public ...

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

    import java.io.Serializable; public class Box implements Serializable { private static final long serialVersionUID = 1L; private int width; private int height; private String name; public void ...

    http依赖jar包.zip

    import java.io.Serializable; import java.util.HashMap; import java.util.Map; import com.google.gson.JsonObject; import com.google.gson.JsonArray; import net.sf.json.JSONObject; import org.apache....

    java jdk io包类详解

    ### Java JDK IO包类详解 #### 概述 Java平台提供的`io`包为开发者提供了访问文件系统、对象序列化等功能的基本输入输出能力。它主要包括字节流、字符流及对象流(字节流的包装类)。此外,还提供了一些基本的文件...

    (完整word版)java6个机制.doc

    import java.io.Serializable; import java.io.FileOutputStream; import java.io.ObjectOutputStream; class TestSerial implements Serializable { public byte version = 100; public byte count = 0; } ...

    java中的序列化与反序列化

    要实现Java对象的序列化,首先需要让对象所属的类实现`java.io.Serializable`接口。这个接口是一个标记接口,不包含任何方法,它的作用是告诉Java虚拟机该类的对象是可以被序列化的。例如: ```java import java.io...

Global site tag (gtag.js) - Google Analytics