Advertisement
Guest User

Пример паттерна Serialization Proxy – ITSobes.ru

a guest
Jun 4th, 2019
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.82 KB | None | 0 0
  1. /**
  2.  * Это пример класса, который хранит свойства idAdmin и isBanned
  3.  * в виде битовых флагов – два младших бита поля flags.
  4.  *
  5.  * Логически это два отдельных булевых поля,
  6.  * так они и должны быть записаны в сериализационной форме.
  7.  *
  8.  *
  9.  * © 2019 Interview Review
  10.  * https://itsobes.ru
  11.  *
  12.  */
  13. public class User implements Serializable {
  14.     private final int flags;
  15.     private final String name;
  16.  
  17.     public User(String name, boolean idAdmin, boolean isBanned) {
  18.         flags = (idAdmin ? 1 : 0) + (isBanned ? 2 : 0);
  19.         this.name = name;
  20.     }
  21.  
  22.     public boolean isAdmin() {
  23.         return (flags & 1) != 0;
  24.     }
  25.  
  26.     public boolean isBanned() {
  27.         return (flags & 2) != 0;
  28.     }
  29.  
  30.     public String getName() {
  31.         return name;
  32.     }
  33.  
  34.     // Далее начинается реализация самого паттерна Serialization Proxy
  35.  
  36.     private Object writeReplace() {
  37.         return new UserSerializationProxy(this);
  38.     }
  39.  
  40.     private void readObject(ObjectInputStream stream) throws InvalidObjectException {
  41.         throw new InvalidObjectException("Proxy required");
  42.     }
  43.  
  44.     public static class UserSerializationProxy implements Serializable {
  45.         private static final long serialVersionUID = 0;
  46.  
  47.         private final boolean isAdmin;
  48.         private final boolean isBanned;
  49.         private final String name;
  50.  
  51.         private UserSerializationProxy(User user) {
  52.             this.isAdmin = user.isAdmin();
  53.             this.isBanned = user.isBanned();
  54.             this.name = user.getName();
  55.         }
  56.  
  57.         private Object readResolve() {
  58.             return new User(name, isAdmin, isBanned);
  59.         }
  60.     }
  61.  
  62.     /**
  63.      * Пример использования. Информация о прокси остается внутри,
  64.      * объект класса сериализуется и десериализуется как обычно.
  65.      */
  66.     public static void main(String[] args) throws Exception {
  67.         User user = new User("John", true, false);
  68.  
  69.         ByteArrayOutputStream out = new ByteArrayOutputStream();
  70.         ObjectOutputStream oos = new ObjectOutputStream(out);
  71.         oos.writeObject(user);
  72.  
  73.         ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
  74.         Object result = ois.readObject();
  75.  
  76.         if (result instanceof User &&
  77.                 ((User) result).name.equals("John") &&
  78.                 ((User) result).isAdmin() &&
  79.                 !((User) result).isBanned()) {
  80.             System.out.println("Деериализованный объект совпадает с оригинальным");
  81.         }
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement