Serializable:保存对象,即 lightweight persistence(不太重要的对象保存很久)
而且也是一个字节一个字节的保存,所以能在不同操作系统下恢复.
找一张Unicode 表, 一些Class 类:没事时自己也能反编译,变成.java文件。
WinHex.exe:这个软件非常好用。
一、Serializable 的实现,只需两步:
第一: 类 implements Serializable :tagging interface,只有一个接口名。
引入tagging inteface目的:和现实世界一样,把类分成各种各样的类型。
1、建立一个共同的父类(Creates a common parent)
2、Adds a data type to a class,
the class becomes an interface type through polymorphism.
如:老师 (这是一个没有任何方法的空接口)
幼儿园老师,小学老师 ,初中老师,(这是具体实现类)
第二:保存地方有两个
1、保存到文件
出:ObjectOutputStream------FileOutputStream
writeObject(东西1)
东西1:1>new的对象
2>可以是String
3>可以是所有的原始类型primitive()
理由:ObjectOutputStream-----ObjectOutput extends DataOutput
有 DataOutputStream ------ DataOutput 一样的方法(即共享相同的接口)
入:ObjectInputStream------ FileInputStream("worm.out")); in.readObject()
2、保存到 ByteArray 缓冲区中
出:ObjectOutputStream------ByteArrayOutputStream writeObject()
入:ObjectInputStream------ ByteArrayInputStream("worm.out"));
in.readObject(东西2) :读的顺序和保存时一直。
二、private transient String password;
transient:表示不需要保存。
有两种形势:1、Worn类里面 有transient 的成员表示不保存。
Worn w = new Worn(6, 'a');
out.writeObject(w);
2、但是也可以单独指定保存。
private transient String b;
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.writeObject(b);
}
SerialCtl sc = new SerialCtl("Test1", "Test2")
stream.writeObject(sc);
三、代码 :
package io;
import static net.mindview.util.Print.print;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Random;
class Data implements Serializable {
private int n;
public Data(int n) {
this.n = n;
}
public String toString() {
return Integer.toString(n);
}
}
public class Worn implements Serializable {
/**
*
*/ //1 占8个字节。
private static final long serialVersionUID = 1L;
private static Random rand = new Random(47);
private Data[] d = { new Data(rand.nextInt(10)),
new Data(rand.nextInt(10)),
new Data(rand.nextInt(10)) };
private Worn next;
private char c;
// Value of i == number of segments
public Worn(int i, char x) {
print("Worm constructor: " + i);
c = x;
if (--i > 0)
next = new Worn(i, (char) (x + 1));
}
public Worn() {
print("Default constructor");
}
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 static void main(String[] args) throws ClassNotFoundException,
IOException {
Worn w = new Worn(6, 'a');
print("w = " + w);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.txt"));
out.writeObject("Worm storage\n");
out.writeObject(w);
out.close(); // Also flushes output
ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.txt"));
String s = (String) in.readObject();
Worn w2 = (Worn) in.readObject();
print(s + "w2 = " + w2);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out2 = new ObjectOutputStream(bout);
out2.writeObject("Worm storage\n");
out2.writeObject(w);
out2.flush();
ObjectInputStream in2 = new ObjectInputStream(new ByteArrayInputStream(
bout.toByteArray()));
s = (String) in2.readObject();
Worn w3 = (Worn) in2.readObject();
print(s + "w3 = " + w3);
}
}
【资料】 http://www.tutorialspoint.com/java/java_interfaces.htm