`

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可以关闭序列化,用以保护数据。
分享到:
评论

相关推荐

    java开源包10

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java开源包1

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java开源包11

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包6

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包9

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    整理后java开发全套达内学习笔记(含练习)

    序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...

    java开源包4

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包101

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包5

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包8

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包3

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    本书的每一章都提供吸引人的练习题、实践问题和本章知识点回顾以强化所学的知识。本书既是帮助读者轻松地通过oca/ocp认证考试的好帮手,也是oracle从业人员必备的参考书。  本书全面覆盖了1z0-051、1z0-052和1z0-...

    疯狂的java讲义源码-JavaEE-Study-Notes:用于记录JavaEE学习过程中的笔记

    疯狂的java讲义 源码 JavaEE-Study-Notes (JavaEE 学习笔记) 用于记录 JavaEE 学习过程中的笔记 知识点预览(个人学习要求) ...多线程编程、NIO、反射、序列化、JVM 调优; 1.2 FrontEnd 前端部分: HTML 4.01、CSS

    Java2核心技术.part5

    12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7版本 12.5.8使用序列化进行...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java开源包2

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

Global site tag (gtag.js) - Google Analytics