fork download
  1. import java.io.ByteArrayInputStream;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.Serializable;
  5.  
  6. public class Main {
  7. public static void main(String[] args) throws IOException, ClassNotFoundException {
  8. SerializableSingleton singleton = SerializableSingleton.INSTANCE;
  9.  
  10. String data = "’\0\5sr\0\25SerializableSingleton\0\0\0\0\0\0\0\1\2\0\1L\0\1at\0\10"
  11. + "LSneaky;xpsr\0\6SneakyOÎæJ&r\234©\2\0\1L\0\1rt\0\27LSerializableSingleton;xpq\0~\0\2";
  12. try(ByteArrayInputStream baos = new ByteArrayInputStream(data.getBytes("iso-8859-1"));
  13. SerializableSingleton official = (SerializableSingleton)oos.readObject();
  14.  
  15. System.out.println(official+"\t"+(official == singleton));
  16. Object inofficial = Sneaky.instance.r;
  17. System.out.println(inofficial+"\t"+(inofficial == singleton));
  18. }
  19. }
  20.  
  21. }
  22. class Sneaky implements Serializable {
  23. static Sneaky instance;
  24.  
  25. SerializableSingleton r;
  26.  
  27. Sneaky(SerializableSingleton s) {
  28. r = s;
  29. }
  30.  
  31. private Object readResolve() {
  32. return instance = this;
  33. }
  34. }
  35. class SerializableSingleton implements Serializable {
  36. public static final SerializableSingleton INSTANCE = new SerializableSingleton();
  37. private static final long serialVersionUID = 1L;
  38.  
  39. private SerializableSingleton() {
  40. System.out.println("SerializableSingleton initialized");
  41. }
  42. protected Object readResolve() {
  43. System.out.println("replacing "+this+" with "+INSTANCE);
  44. return INSTANCE;
  45. }
  46. }
  47.  
Success #stdin #stdout 0.18s 38388KB
stdin
Standard input is empty
stdout
SerializableSingleton initialized
replacing SerializableSingleton@255316f2 with SerializableSingleton@41906a77
SerializableSingleton@41906a77	true
SerializableSingleton@255316f2	false