public static void main(String[] args) { ObjectStreamClass osc = ObjectStreamClass.lookup(User.class); long id = osc.getSerialVersionUID(); System.out.println("用戶對象版本號:" + id); }
用戶對象版本號:-6389397398684165955
ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { ObjectOutputStream oos = new ObjectOutputStream(bos); //準備寫入用戶對象
oos.writeObject(user); oos.flush(); //序列化後獲得的字符串
String value = Hex.toHexString(bos.toByteArray()); bos.close(); } catch (IOException e) { e.printStackTrace(); }
byte[] serialized = Hex.decode(value); ByteArrayInputStream bis = new ByteArrayInputStream(serialized); ObjectInputStream ois = new ObjectInputStream(bis); User user = (User) ois.readObject();
import org.bouncycastle.util.encoders.Hex; import java.io.*; /** * 序列化與反序列測試 * * @author wzm * @version 1.0.0 * @date 2020/1/27 18:21 **/
public class JavaSerializationTest { static class User { String name; String sex; int age; User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } @Override public String toString() { return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}'; } } private static String save(User user) { String value = ""; try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos)) { //準備寫入用戶對象
oos.writeObject(user); oos.flush(); //序列化後獲得的字符串
value = Hex.toHexString(bos.toByteArray()); System.out.println("用戶:" + value); } catch (IOException e) { e.printStackTrace(); System.out.println(e.getMessage()); } return value; } private static User get(String userStr) { try { byte[] serialized = Hex.decode(userStr); ByteArrayInputStream bis = new ByteArrayInputStream(serialized); ObjectInputStream ois = new ObjectInputStream(bis); return (User) ois.readObject(); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); throw new RuntimeException(e); } } public static void main(String[] args){ User user = new User("小明", "男", 20); String userStr = save(user); User user1 = get(userStr); System.out.println(user1); } }
java.io.NotSerializableException: fabric.edu.common.JavaSerializationTest$User fabric.edu.common.JavaSerializationTest$User at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at fabric.edu.common.JavaSerializationTest.save(JavaSerializationTest.java:42) at fabric.edu.common.JavaSerializationTest.main(JavaSerializationTest.java:69) java.io.EOFException null at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2681) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3156) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358) at fabric.edu.common.JavaSerializationTest.get(JavaSerializationTest.java:58) at fabric.edu.common.JavaSerializationTest.main(JavaSerializationTest.java:70) Exception in thread "main" java.lang.RuntimeException: java.io.EOFException at fabric.edu.common.JavaSerializationTest.get(JavaSerializationTest.java:63) at fabric.edu.common.JavaSerializationTest.main(JavaSerializationTest.java:70) Caused by: java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2681) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3156) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358) at fabric.edu.common.JavaSerializationTest.get(JavaSerializationTest.java:58) ... 1 more
private void writeObject0(Object obj, boolean unshared) throws IOException { boolean oldMode = bout.setBlockDataMode(false); depth++; try { // handle previously written and non-replaceable objects
int h; if ((obj = subs.lookup(obj)) == null) { writeNull(); return; } else if (!unshared && (h = handles.lookup(obj)) != -1) { writeHandle(h); return; } else if (obj instanceof Class) { writeClass((Class) obj, unshared); return; } else if (obj instanceof ObjectStreamClass) { writeClassDesc((ObjectStreamClass) obj, unshared); return; } // check for replacement object
Object orig = obj; Class<?> cl = obj.getClass(); ObjectStreamClass desc; for (;;) { // REMIND: skip this check for strings/arrays?
Class<?> repCl; desc = ObjectStreamClass.lookup(cl, true); if (!desc.hasWriteReplaceMethod() || (obj = desc.invokeWriteReplace(obj)) == null || (repCl = obj.getClass()) == cl) { break; } cl = repCl; } if (enableReplace) { Object rep = replaceObject(obj); if (rep != obj && rep != null) { cl = rep.getClass(); desc = ObjectStreamClass.lookup(cl, true); } obj = rep; } // if object replaced, run through original checks a second time
if (obj != orig) { subs.assign(orig, obj); if (obj == null) { writeNull(); return; } else if (!unshared && (h = handles.lookup(obj)) != -1) { writeHandle(h); return; } else if (obj instanceof Class) { writeClass((Class) obj, unshared); return; } else if (obj instanceof ObjectStreamClass) { writeClassDesc((ObjectStreamClass) obj, unshared); return; } } // remaining cases
if (obj instanceof String) { writeString((String) obj, unshared); } else if (cl.isArray()) { writeArray(obj, desc, unshared); } else if (obj instanceof Enum) { writeEnum((Enum<?>) obj, desc, unshared); } else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException( cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName()); } } } finally { depth--; bout.setBlockDataMode(oldMode); } }
實現序列化接口
static class User implements Serializable { String name; String sex; int age; User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } @Override public String toString() { return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}'; } }
用戶:aced00057372002c6661627269632e6564752e636f6d6d6f6e2e4a61766153657269616c697a6174696f6e546573742455736572e16c1276e8beef3b0200034900036167654c00046e616d657400124c6a6176612f6c616e672f537472696e673b4c000373657871007e0001787000000014740006e5b08fe6988e740003e794b7 User{name='小明', sex='男', age=20}