java: 대상 직렬 화 와 반 직렬 화 (대상 정보 저장)

5694 단어 자바
일반적으로 대상 의 정 보 를 파일 에 저장 하여 전송 하기에 편리 하 다.
다음은 데모 코드 입 니 다.
먼저 일반적인 클래스 를 만 듭 니 다.
직렬 화 인 터 페 이 스 를 먼저 연결 해 야 합 니 다. 바로 Serializable 인터페이스 입 니 다. 
toString 방법 을 다시 쓰 십시오. 그렇지 않 으 면 대상 정 보 를 인쇄 할 때 대상 정보의 메모리 주 소 를 인쇄 합 니 다.
package encodetest;

import java.io.Serializable;

public class Student implements Serializable {
	private String stuno;
	private String stuname;
	private int stuage;

	public Student() {

	}

	public Student(String stuno, String stuname, int stuage) {
		super();
		this.stuno = stuno;
		this.stuname = stuname;
		this.stuage = stuage;
	}

	public String getStuno() {
		return stuno;
	}

	public void setStuno(String stuno) {
		this.stuno = stuno;
	}

	public String getStuname() {
		return stuname;
	}

	public void setStuname(String stuname) {
		this.stuname = stuname;
	}

	public void setStuage(int stuage) {
		this.stuage = stuage;
	}

	public int getStuage() {
		return stuage;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Student[stuno="+stuno+",stuname="+stuname+",stuage="+stuage+"]";
	}

}

그리고 서열 화 대상 에 사용 할 클래스 를 따로 엽 니 다.
package encodetest;

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 Object_Seria_Demo1 {

	public static void main(String[] args) 
			throws FileNotFoundException, IOException {
		String file = "demo05.txt";

		ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream(file));
		Student stu = new Student("10001", "张三", 20);//Student类的实类
		oos.writeObject(stu);
		oos.flush();//刷新缓冲区
		oos.close();//关闭流

		ObjectInputStream ois = new ObjectInputStream(
				new FileInputStream(file));
		try {
			Student stu1 = (Student) ois.readObject();//提取出来时是object类,需要强转一下
			System.out.println(stu1);
			ois.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

여기 조심해!!
어떻게 스스로 대상 속성 을 서열 화 하 는 지 아래 의 코드 를 보면 위의 코드 와 같은 종류 입 니 다.
쉽게 말 하면 클래스 속성 에 transient 키 워드 를 추가 한 후에 가상 컴퓨터 는 이 속성 을 직렬 화 하지 않 지만 스스로 이 속성 을 직렬 화 할 수 있 습 니 다.
자기가 새로 써.  서열 화  ... 과  역 직렬 화  방법
package encodetest;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Student implements Serializable {
	private String stuno;
	private String stuname;
	// 添加transient关键字之后,该属性不会被储存到数据文件,
	// 也就是不会被jvm进行默认的序列化,但是可以自己将该属性序列化
	private transient int stuage;

	public Student() {

	}

	public Student(String stuno, String stuname, int stuage) {
		super();
		this.stuno = stuno;
		this.stuname = stuname;
		this.stuage = stuage;
	}

	public String getStuno() {
		return stuno;
	}

	public void setStuno(String stuno) {
		this.stuno = stuno;
	}

	public String getStuname() {
		return stuname;
	}

	public void setStuname(String stuname) {
		this.stuname = stuname;
	}

	public void setStuage(int stuage) {
		this.stuage = stuage;
	}

	public int getStuage() {
		return stuage;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Student[stuno=" + stuno + ",stuname=" + stuname + ",stuage=" + stuage + "]";
	}

	// 注意看下面方法中参数的声明类型

	// 自己写序列化writeObject方法,让填写了transient关键字的属性也可以序列化
	private void writeObject(ObjectOutputStream s) throws IOException {
		s.defaultWriteObject();// 把虚拟机能默认序列化的元素进行序列化操作
		s.writeInt(stuage);// 自己完成stuage的序列化
	}

	// 自己写反序列化方法
	private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
		s.defaultReadObject();// 把jvm默认可以反序列化的元素进行反序列化
		// 将stuage属性从文件中读出来,
		// 也就是手动完成stuage的反序列化
		this.stuage = s.readInt();
	}
}

그리고 부모 클래스 가 직렬 화 인 터 페 이 스 를 실현 할 때 하위 클래스 도 직렬 화 할 수 있 는데 이것 은 집합 하 는 일반적인 프로 그래 밍 과 차이 가 많 지 않다.
그러나 하위 클래스 는 직렬 화 된다. 
아버지 류 가 실현 되 지 않 았 을 때, 반 서열 화 될 때,
부모 구조 방법 을 호출 할 수 있 습 니 다. 잘 모 르 겠 지만 코드 를 직접 올 리 세 요.
package demo;

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

public class Object_Seria_Demo2 {

	public static void main(String[] args) throws IOException {
		String file = "demo06.txt";
		ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream(file));
		Foo2 foo2 = new Foo2();//
		oos.writeObject(foo2);//序列化
		oos.flush();// 刷新缓冲区
		oos.close(); // 关闭流
		
		ObjectInputStream ois=new ObjectInputStream(
				new FileInputStream(file));
		try {
			Foo2 foo_2=(Foo2)ois.readObject();//反序列化
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
//普通类
class Foo implements Serializable {
	public Foo() {
		System.out.println("foo...");
	}
}

class Foo1 extends Foo{
	public Foo1() {
		System.out.println("foo1...");
	}
}

class Foo2 extends Foo1 {
	public Foo2() {
		System.out.println("foo2...");
	}
}

원 리 를 말 하 다.
부모 클래스 가 Serializable 인 터 페 이 스 를 실현 하지 못 했 을 때 가상 컴퓨터 는 부모 대상 을 서열 화하 지 않 는 다. 자바 대상 의 구 조 는 반드시 부모 대상 이 있어 야 하위 대상 이 있 고 반 서열 화도 예외 가 아니다.
그래서 반 직렬 화 할 때 부모 대상 을 구성 하기 위해 서 는 부모 류 의 무 참 구조 함수 만 기본 적 인 부모 대상 으로 사용 할 수 있 습 니 다.
이것 은 원리 이 고,  간단하게 말 하면 부계 가 서열 화 인 터 페 이 스 를 실현 하지 못 하면 반 서열 화 자 류 는 부계 의 기본 구조 방법 을 사용한다.
코드 가 바로 위 에 있 습 니 다. 수정 해 보면 알 수 있 습 니 다.
기본적으로 이렇다.
만약 누가 보고 이해 하지 못 하면 댓 글로 질문 을 남 겨 도 된다. 나 는 가능 한 한 대답 할 것 이다. 비록 나 도 매우 요리 하지만.

좋은 웹페이지 즐겨찾기