本文共 6271 字,大约阅读时间需要 20 分钟。
????Object Stream??Java??????????????Java????????????????????????????????????????????????
1. ??????
?????????ObjectInputStream?ObjectOutputStream??????????????????????????????Java???????????????????????????
????????
??????????????????Java??????????????????ObjectOutputStream??????????????ObjectInputStream??????????????????????????????????Serializable???????????NoSerializableException???
????
- ?????
ObjectOutputStream?ObjectInputStream??????????????????????????????? - transient?????
transient?????????????????????????????????int?0?Object?null??
2. ???????
???????????????????Serializable???????????????????????????????????
??????
- ??????????????????????Java???????????
- ???????????????????????????????????????
- ???????????????????????????????????
????????
??????????????????
Serializable????????????????????NotSerializableException???serialVersionUID???????????????????????????????????serialVersionUID?JVM????????????????int?String???????????????????????Serializable???????????3. ??????
??????
???????????????????
import java.io.*;import java.io.Serializable;public class TestObjectStream { public static void main(String[] args) throws IOException { // ????? ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.obj")); String data = "Hello, World!"; oos.writeObject(data); oos.flush(); oos.close(); // ?????? ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.obj")); Object obj = ois.readObject(); System.out.println((String) obj); // ?? "Hello, World!" ois.close(); }} ???????ObjectOutputStream????"Hello, World!"??????????ObjectInputStream?????????????????
????????
???????????????????????????????????Serializable????????
public class Person implements Serializable { private static final long serialVersionUID = 123456789012345678L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name=" + name + ", age=" + age + '}'; }} ????????????????????????Address??????????Serializable???
4. ???????
?????????
???A??B??serialVersionUID?????????????InvalidClassException??????
- A????
serialVersionUID?7246350247175365830L - B????
serialVersionUID?7346350247175365830L
??????JVM?????serialVersionUID??????????????
????????
??A??????????B????????????????????????????
- A???????
public class Person implements Serializable { private static final long serialVersionUID = 7346350247175365830L; private String name; private int age; private int sex;} - B???????
public class Person implements Serializable { private static final long serialVersionUID = 7346350247175365830L; private String name; private int age;}
??????????
Person{name=???????, age=123} ???sex???????
?????????
??B????serialVersionUID??????????????????????????????
- A???????
public class Person implements Serializable { private static final long serialVersionUID = 7346350247175365830L; private String name; private int age;} - B???????
public class Person implements Serializable { private static final long serialVersionUID = 7346350247175365830L; private String name; private int age; private int sex;}
??????????
Person{name=???????, age=123, sex=0} ???sex?????????????????0?
5. ???transient?????
????
???????ObjectOutputStream?ObjectInputStream????????????
public class TestStatic implements Serializable { private static final long serialVersionUID = -4662715330378065625L; public static int ver = 123; public transient String aa; public static void main(String[] args) throws IOException { TestStatic test = new TestStatic(); test.setAa("dfadfasdf"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.obj")); oos.writeObject(test); oos.flush(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.obj")); Object obj = ois.readObject(); if (obj instanceof TestStatic) { TestStatic test = (TestStatic) obj; System.out.println(test.getVer()); // ?? 123 System.out.println(test.getAa()); // ?? "dfadfasdf" } } public int getVer() { return ver; } public void setVer(int ver) { TestStatic.ver = ver; } public String getAa() { return aa; } public void setAa(String aa) { this.aa = aa; } @Override public String toString() { return "TestStatic{" + "ver=" + ver + ", aa='" + aa + '\'' + '}'; }} ??????ver????123??aa???null???transient?????????
transient??
transient???????????????????????????
public class TestTransient implements Serializable { private static final long serialVersionUID = -4662715330378065625L; public transient String aa; public static void main(String[] args) throws IOException { TestTransient test = new TestTransient(); test.setAa("dfadfasdf"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.obj")); oos.writeObject(test); oos.flush(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.obj")); Object obj = ois.readObject(); if (obj instanceof TestTransient) { TestTransient test = (TestTransient) obj; System.out.println(test.getAa()); // ?? null } } public String getAa() { return aa; } public void setAa(String aa) { this.aa = aa; } @Override public String toString() { return "TestTransient{" + "aa='" + aa + '\'' + '}'; }} ??????aa???null???????transient???
6. ??
????Java??????????????????????????????ObjectInputStream?ObjectOutputStream??????????Java???????????????????????????????????????serialVersionUID????????static?transient??????????????????????
发表评论
最新留言
关于作者