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 인 터 페 이 스 를 실현 하지 못 했 을 때 가상 컴퓨터 는 부모 대상 을 서열 화하 지 않 는 다. 자바 대상 의 구 조 는 반드시 부모 대상 이 있어 야 하위 대상 이 있 고 반 서열 화도 예외 가 아니다.
그래서 반 직렬 화 할 때 부모 대상 을 구성 하기 위해 서 는 부모 류 의 무 참 구조 함수 만 기본 적 인 부모 대상 으로 사용 할 수 있 습 니 다.
이것 은 원리 이 고, 간단하게 말 하면 부계 가 서열 화 인 터 페 이 스 를 실현 하지 못 하면 반 서열 화 자 류 는 부계 의 기본 구조 방법 을 사용한다.
코드 가 바로 위 에 있 습 니 다. 수정 해 보면 알 수 있 습 니 다.
기본적으로 이렇다.
만약 누가 보고 이해 하지 못 하면 댓 글로 질문 을 남 겨 도 된다. 나 는 가능 한 한 대답 할 것 이다. 비록 나 도 매우 요리 하지만.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.