
| 직렬화를 지원하지 않으면서 상태를 가진 클래스 | |
|---|---|
| {code:java} //============================================== // AbstractFoo.java //============================================== import java.io.*; |
public abstract class AbstractFoo{
private int x, y;
private boolean initialized = false;
public AbstractFoo(int x, int y){ initialize(x,y); }
protected AbstractFoo(){}
protected final void initialize(int x, int y){
if(initialized)
throw new IllegalStateException("Already initialized");
this.x = x;
this.y = y;
initialized = true;
}
protected final int getX(){ return x; }
protected final int getY(){ return y; }
private void checkInit() throws IllegalStateException{
if(!initialized)
throw new IllegalStateException("Uninitialized");
}
public String toString() {
return "x = "x", y = "+y;
}
}
{code:java}
//==============================================
// Foo.java
//==============================================
import java.io.*;
public class Foo extends AbstractFoo implements Serializable{
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException{
System.out.println("readObject ");
s.defaultReadObject();
int x = s.readInt();
int y = s.readInt();
initialize(x,y);
}
private void writeObject(ObjectOutputStream s)
throws IOException {
System.out.println("writeObject ");
System.out.println(" x : "+ getX());
System.out.println(" y : "+ getY());
s.defaultWriteObject();
s.writeInt(getX());
s.writeInt(getY());
}
public Foo(int x, int y){ super(x,y);}
}
|
//==============================================
// Main.java
//==============================================
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
try{
Foo fo = new Foo(10,4);
FileOutputStream fos = new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(fo);
oos.close();
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Foo foCp = (Foo)ois.readObject();
System.out.println("readObject : " + foCp);
System.out.println(foCp.getX());
System.out.println(foCp.getY());
ois.close();
}catch(Exception e){}
}
}
|
| 바람직한 맞춤 직렬화 형태를 제공하는 StringList | |
|---|---|
| {code:java} //============================================== // StringList.java //============================================== import java.io.*; |
public class StringList implements Serializable{
public transient int size = 0;
public transient Entry head = null;
private static class Entry{
String data ="D";
Entry next;
Entry previous;
}
public void add(String s){
}
private void writeObject(ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
s.writeInt(size);
for(Entry e=head; e != null ; e = e.next)
s.writeObject(e.data);
}
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException{
s.defaultReadObject();
int numElements = s.readInt();
for(int i = 0; i< numElements; i++){
add((String)s.readObject());
}
}
}
| {code:java}
//==============================================
// Main.java
//==============================================
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
try{
StringList sl = new StringList();
System.out.println("writeObject : " + sl );
FileOutputStream fos = new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos );
oos.writeObject(sl);
oos.close();
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
StringList slcp = (StringList )ois.readObject();
System.out.println("readObject : " + slcp );
ois.close();
}catch(Exception e){}
}
}
|
| {code:java} //============================================== // Period.java //============================================== import java.io.*; import java.util.*; |
public final class Period implements Serializable{
//private final Date start;
//private final Date end;
private Date start;
private Date end;
public Period(Date start, Date end){
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if(this.start.compareTo(this.end) > 0)
throw new IllegalArgumentException(start + " > " + end);
}
public Date start(){ return (Date) start.clone();}
public Date end(){ return (Date)end.clone();}
public String toString(){ return start + "-" + end; }
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException
{
s.defaultReadObject();
start = new Date(start .getTime());
end = new Date(end.getTime());
if(start.compareTo(end) > 0)
throw new InvalidObjectException(start + " after " + end);
}
}
{code:java}
//==============================================
// MutablePeriod.java
//==============================================
import java.io.*;
import java.util.*;
public class MutablePeriod{
public final Period period;
public final Date start;
public final Date end;
public MutablePeriod(){
try{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(new Period(new Date(),new Date()));
byte[] ref = {0x71,0,0x7e,0,5};
bos.write(ref);
ref[4] = 4;
bos.write(ref);
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
period = (Period) in.readObject();
start = (Date) in.readObject();
end = (Date) in.readObject();
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
}
|
//==============================================
// Main.java
//==============================================
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
try{
MutablePeriod mp = new MutablePeriod();
Period p = mp.period;
Date pEnd = mp.end;
pEnd.setYear(78);
System.out.println(p);
pEnd.setYear(69);
System.out.println(p);
}catch(Exception e){}
}
}
|
| 바람직한 맞춤 직렬화 형태를 제공하는 StringList | |
|---|---|
| {code:java} //============================================== // Elvis.java //============================================== import java.io.*; |
public class Elvis implements Serializable{
public static final Elvis INSTANCE = new Elvis();
transient String name = "Elvis";
private Elvis(){
System.out.println("This is the Elvis Class");
}
public static Elvis getInstance(){
return INSTANCE;
}
private Object readResolve() throws ObjectStreamException
{
return INSTANCE;
}
public String getName(){
return name;
}
}
| {code:java}
//==============================================
// Main.java
//==============================================
import java.io.*;
public class Main{
void writeObj(){
Elvis e = Elvis.getInstance();
try{
FileOutputStream fos = new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(e);
}catch(Exception ex){}
}
Elvis readObj() throws Exception
{
Elvis e = null;
try{
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
e=(Elvis)ois.readObject();
}catch(Exception ex){}
return e;
}
public static void main(String args[]){
try{
Main main = new Main();
System.out.println(Elvis.getInstance());
main.writeObj();
System.out.println(main.readObj());
}catch(Exception e){}
}
}
|