`

java需要关注的知识点---I0之对象序列化

 
阅读更多
1。对象序列化:
序列化是什么:
  序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
  序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
  序列化的什么特点:
  如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
  什么时候使用序列化:
  一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
  二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中 或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列

序列化我是实现轻量级持久性。

package com.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
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;
import java.util.Random;

public class ObjectSer implements Serializable{
	private static Random random = new Random(47);
	private Data[] d = {
			new Data(random.nextInt(10)),
			new Data(random.nextInt(10)),
			new Data(random.nextInt(10))
	};
	private ObjectSer next;
	private char c;
	
	public ObjectSer(int i, char x) {
		super();
		System.out.println("ObjectSer constructor:" + i);
		c = x;
		if(--i > 0) {
			next = new ObjectSer(i,(char)(x+1));
		}
	}
	
	public String toString() {
		StringBuilder result = new StringBuilder(":");
		result.append(c);
		result.append("(");
		for(Data dat:d)
			result.append(dat);
		result.append(")");
		if(next != null)
		result.append(next);
		return result.toString();
	}

	public ObjectSer() {
		super();
		System.out.println("Default constructor");
	}

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		ObjectSer os = new ObjectSer(6,'a');
		System.out.println("os =:" +os);
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.out"));
		out.writeObject("Object storage\n");
		out.writeObject(os);
		out.close();
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.out"));
		String s = (String)in.readObject();
		ObjectSer objects = (ObjectSer)in.readObject();
		System.out.println(s+ " objects: " + objects);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		ObjectOutputStream out2 = new ObjectOutputStream(bout);
		out2.writeObject("Objectser storage\n");
		out2.writeObject(os);
		out2.flush();
		ObjectInputStream in2 = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
		s = (String)in2.readObject();
		ObjectSer os2 = (ObjectSer)in2.readObject();
		System.out.println(s + " os2 = "+os2);
	}

}

class Data implements Serializable {
	private int n;
	public Data(int n) {this.n = n;}
	public String toString() {return Integer.toString(n);}
}



结果:
ObjectSer constructor:6
ObjectSer constructor:5
ObjectSer constructor:4
ObjectSer constructor:3
ObjectSer constructor:2
ObjectSer constructor:1
os =::a(853):b(119):c(802):d(788):e(199):f(881)
Object storage
 objects: :a(853):b(119):c(802):d(788):e(199):f(881)
Objectser storage
 os2 = :a(853):b(119):c(802):d(788):e(199):f(881)

序列化控制,Externalizable.

package com.io;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class BlipsExternalizable {
	public static void main(String[] args) throws IOException, IOException, ClassNotFoundException {
		Blip1 b1 = new Blip1();
		Blip2 b2 = new Blip2();
		ObjectOutputStream dos = new ObjectOutputStream(new FileOutputStream("Blp.obj"));
		dos.writeObject(b1);
		dos.writeObject(b2);
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Blp.obj"));
		b1 = (Blip1)ois.readObject();
		b2 = (Blip2)ois.readObject();
	}
	
}
class Blip1 implements Externalizable {
	public Blip1(){
		System.out.println("Blip1 constructor");
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		System.out.println("Blip1 read");
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		System.out.println("Blip1 write");
	}
}
class Blip2 implements Externalizable {
	Blip2() {
		System.out.println("Blip2 constructor");
	}
	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		System.out.println("Blip2 read");
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		System.out.println("Blip2 write");
	}
}
结果:
Blip1 constructor
Blip2 constructor
Blip1 write
Blip2 write
Blip1 constructor
Blip1 read
Exception in thread "main" java.io.InvalidClassException: com.io.Blip2; com.io.Blip2; no valid constructor
	at java.io.ObjectStreamClass.checkDeserialize(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at com.io.BlipsExternalizable.main(BlipsExternalizable.java:21)
Caused by: java.io.InvalidClassException: com.io.Blip2; no valid constructor
	at java.io.ObjectStreamClass.<init>(Unknown Source)
	at java.io.ObjectStreamClass.lookup(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at com.io.BlipsExternalizable.main(BlipsExternalizable.java:18)


public class Blip3Externalizable implements Externalizable {
	private String s;
	private int i;
	public Blip3Externalizable() {
		super();
		System.out.println("Blip constructor");
	}
	
	public Blip3Externalizable(String s, int i) {
		super();
		System.out.println("Blip constructor(s,i)");
		this.s = s;
		this.i = i;
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		System.out.println("Blip read");
		//reset the attribute value.
		s = (String)in.readObject();
		i = in.readInt();
		
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		System.out.println("Blip write");
		out.writeObject(s);
		out.writeInt(i);
	}
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		Blip3Externalizable blip = new Blip3Externalizable("String", 41);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("blip.obj"));
		oos.writeObject(blip);
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("blip.obj"));
		blip = (Blip3Externalizable) ois.readObject();
		System.out.println(blip.i);
	}

}


使用transient可以关闭序列化,用以保护数据。
分享到:
评论

相关推荐

    Netty服务端与客户端依靠Java序列化传输数据

    Java序列化是Java平台内建的一种标准对象序列化机制,它允许对象的状态被保存和恢复,这对于分布式应用和服务之间的通信尤其重要。 在Netty中,Java序列化可以作为数据传输的一种方式,尤其是在服务端和客户端之间...

    java高手必备知识点

    ### Java高手必备知识点详解 #### 一、面向对象分析与设计(OOA/OOD)、设计模式及UML **1. 面向对象分析与设计(OOA/OOD):** 面向对象分析与设计是一种软件开发方法论,强调通过抽象、封装、继承和多态等机制来...

    面试知识点总结--Java面向对象.pdf

    Java面向对象是Java编程的核心,理解其概念和特性对于成为一名合格的Java开发者至关重要...以上就是Java面向对象面试中常见的知识点,理解并掌握这些内容对于Java开发人员来说非常重要,尤其是在面试和实际开发过程中。

    JAVA核心知识点整理.zip

    5. **输入/输出流**:Java I/O流系统支持文件读写、网络通信和数据序列化。理解流的分类(如字节流和字符流)、缓冲区、对象流和文件操作是关键。 6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、...

    Core Java Volume I - Fundamentals

    11. **输入/输出流**:包括文件I/O、对象序列化和网络I/O,是处理数据传输的基础。 12. **多线程**:Java内置了对多线程的支持,包括线程的创建、同步和通信。 13. **反射API**:在运行时动态地获取类信息和调用...

    Java项目开发实践---网络篇

    Java的JAXB(Java Architecture for XML Binding)可以将XML文档与Java对象绑定,简化数据的序列化和反序列化。 7. **源码分析** 包含的源码示例可以帮助读者理解如何在实际项目中运用上述概念。通过阅读和运行...

    【Java技术资料】-JAVA核心知识点整理

    - **对象序列化**:理解对象持久化的原理和实现方式。 6. **多线程** - **线程的创建**:通过Thread类和Runnable接口创建线程。 - **线程同步**:synchronized关键字、wait()、notify()、notifyAll()的使用,...

    校招Java面试常见知识点

    - **I/O流**:文件流、字符流、缓冲流、对象序列化等。 - **反射**:在运行时动态获取类的信息并操作对象。 - **设计模式**:常见的23种设计模式,如单例、工厂、装饰器等。 3. **Java高级特性**: - **Lambda...

    java序列化存储读取文件.doc

    根据提供的文件标题、描述以及部分代码内容,我们可以总结出该文档主要关注的是Java中的序列化技术,特别是如何利用序列化来存储和读取文件。接下来,我们将深入探讨这些知识点。 ### Java序列化简介 Java序列化是...

    Java面向对象程序设计

    13. **I/O流**:Java的I/O流系统支持数据的输入和输出,包括字符流和字节流,以及过滤流、缓冲流、对象序列化等高级功能。 14. **反射**:反射机制允许程序在运行时动态获取类的信息(如类名、方法名等)并调用方法...

    Java语言程序设计-基础篇-中文ppt-第十九章.ppt

    Java允许将对象的状态保存到文件中,这个过程称为序列化,使用`ObjectOutputStream`。反序列化则是从文件中恢复对象,使用`ObjectInputStream`。并非所有对象都可以序列化,只有实现了`Serializable`接口的对象才能...

    Core Java(Volume I--Fundamentals 9th Edition)

    6. **输入/输出(I/O)**:介绍Java的流模型,包括文件I/O、字节流、字符流、对象序列化和数据流。 7. **泛型**:讲解泛型的基本概念,如何在类、接口和方法中使用泛型,以及通配符和类型擦除。 8. **多线程**:包括...

    Core.Java.Volume.I.Fundamentals.10th.Edition.2016.1

    根据给定文件的信息,我们可以提炼出以下关于《Core Java Volume I—Fundamentals》第十版的知识点: ### 一、书籍基本信息 - **书名**:《Core Java Volume I—Fundamentals》 - **作者**:Cay S. Horstmann - **...

    java输入输出--java实例17例

    3. **对象序列化与反序列化**:Java的Serializable接口允许对象被转换为字节流,方便存储和网络传输。在某些示例中,可能会展示如何实现序列化和反序列化,以便持久化对象状态。 4. **文件输入输出流**:...

    容易搞混的Java知识点

    在Java编程语言中,有一些知识点非常容易混淆,特别是在面试中...了解并理解这些容易混淆的Java知识点对于编写高质量的代码和成功通过面试至关重要。在实际编程中,应特别注意这些细节,以避免潜在的错误和意外行为。

    Core Java(Volume II--Advanced Features 9th Edition).pdf

    6. **Java序列化**:Java序列化用于将对象状态转化为字节流,便于存储和网络传输。书中讨论了如何实现Serializable接口,序列化和反序列化过程,以及自定义序列化行为。 7. **异常处理**:Java的异常处理机制是其...

    java-source-code-drawing-board.rar_JAVA-drawing-board_drawing

    这需要实现文件I/O操作,例如使用`FileInputStream`和`FileOutputStream`读写文件,以及序列化和反序列化对象。 10. **用户体验**: 为了提供良好的用户体验,可能需要添加撤销/重做功能,以及选择不同颜色、线条...

    java从入门到精通--实例

    7. **I/O流**:Java的IO流处理允许程序进行数据的输入输出,包括字符流和字节流,以及缓冲区、转换流和对象序列化等高级特性。 8. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,实现网络通信。...

    Java小游戏之Warcraft-Remake

    7. **序列化与反序列化**:保存和加载游戏进度时,Java的序列化接口(Serializable)可以帮助将对象状态转化为字节流。 8. **游戏逻辑**:包括单位行动规则、建筑建造条件、资源采集机制等,这些都需要通过编程逻辑...

    (超赞)JAVA精华之--深入JAVA API

    - `ObjectInputStream` 和 `ObjectOutputStream` 支持序列化和反序列化 Java 对象。 - **字符流** - `InputStreamReader` 和 `OutputStreamWriter` 用于读写字符数据,通常与编码解码相关联。 - **随机存取文件*...

Global site tag (gtag.js) - Google Analytics