fork(1) download
  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7.  
  8. class Parent implements Serializable {
  9.  
  10. private Child child;
  11.  
  12. public Child getChild() {
  13. return child;
  14. }
  15.  
  16. public void setChild(Child child) {
  17. this.child = child;
  18. }
  19. }
  20.  
  21. interface Child {
  22. }
  23.  
  24. class SerializableChild implements Child, Serializable {
  25. }
  26.  
  27. class NonSerializableChild implements Child {
  28. }
  29.  
  30. public class Main {
  31. public static void main(String[] args) throws java.lang.Exception {
  32.  
  33. doNull();
  34.  
  35. doSerializable();
  36.  
  37. doNonSerializable();
  38. }
  39.  
  40. /**
  41.   * child が null 状態でシリアライズ/デシリアライズ
  42.   */
  43. private static void doNull() {
  44. Parent obj = new Parent();
  45.  
  46. byte[] res = serialize(obj);
  47. deserialize(res);
  48. }
  49.  
  50. /**
  51.   * child にシリアライズ可能なオブジェクトをセットしてシリアライズ/デシリアライズ
  52.   */
  53. private static void doSerializable() {
  54. Parent obj = new Parent();
  55. obj.setChild(new SerializableChild());
  56.  
  57. byte[] res = serialize(obj);
  58. deserialize(res);
  59. }
  60.  
  61. /**
  62.   * child にシリアライズ可能でないオブジェクトをセットしてシリアライズ/デシリアライズ
  63.   */
  64. private static void doNonSerializable() {
  65. Parent obj = new Parent();
  66. obj.setChild(new NonSerializableChild());
  67.  
  68. byte[] res = serialize(obj);
  69. deserialize(res);
  70. }
  71.  
  72. private static void deserialize(byte[] serialized) {
  73. try (ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(serialized))) {
  74. Object res = is.readObject();
  75. System.out.println(res.toString());
  76. throw new RuntimeException("デシリアライズ時エラー", e);
  77. }
  78. }
  79.  
  80. private static byte[] serialize(Parent obj) {
  81.  
  82. try (ObjectOutputStream os = new ObjectOutputStream(bas)) {
  83. os.writeObject(obj);
  84. } catch (IOException e) {
  85. throw new RuntimeException("シリアライズ時エラー", e);
  86. }
  87. byte[] serialized = bas.toByteArray();
  88. return serialized;
  89. }
  90. }
  91.  
Runtime error #stdin #stdout #stderr 0.15s 320704KB
stdin
Standard input is empty
stdout
Parent@1c7c054
Parent@a14482
stderr
Exception in thread "main" java.lang.RuntimeException: シリアライズ時エラー
	at Main.serialize(Main.java:87)
	at Main.doNonSerializable(Main.java:68)
	at Main.main(Main.java:37)
Caused by: java.io.NotSerializableException: NonSerializableChild
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at Main.serialize(Main.java:85)
	... 2 more