Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Это пример класса, который хранит свойства idAdmin и isBanned
- * в виде битовых флагов – два младших бита поля flags.
- *
- * Логически это два отдельных булевых поля,
- * так они и должны быть записаны в сериализационной форме.
- *
- *
- * © 2019 Interview Review
- * https://itsobes.ru
- *
- */
- public class User implements Serializable {
- private final int flags;
- private final String name;
- public User(String name, boolean idAdmin, boolean isBanned) {
- flags = (idAdmin ? 1 : 0) + (isBanned ? 2 : 0);
- this.name = name;
- }
- public boolean isAdmin() {
- return (flags & 1) != 0;
- }
- public boolean isBanned() {
- return (flags & 2) != 0;
- }
- public String getName() {
- return name;
- }
- // Далее начинается реализация самого паттерна Serialization Proxy
- private Object writeReplace() {
- return new UserSerializationProxy(this);
- }
- private void readObject(ObjectInputStream stream) throws InvalidObjectException {
- throw new InvalidObjectException("Proxy required");
- }
- public static class UserSerializationProxy implements Serializable {
- private static final long serialVersionUID = 0;
- private final boolean isAdmin;
- private final boolean isBanned;
- private final String name;
- private UserSerializationProxy(User user) {
- this.isAdmin = user.isAdmin();
- this.isBanned = user.isBanned();
- this.name = user.getName();
- }
- private Object readResolve() {
- return new User(name, isAdmin, isBanned);
- }
- }
- /**
- * Пример использования. Информация о прокси остается внутри,
- * объект класса сериализуется и десериализуется как обычно.
- */
- public static void main(String[] args) throws Exception {
- User user = new User("John", true, false);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(out);
- oos.writeObject(user);
- ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
- Object result = ois.readObject();
- if (result instanceof User &&
- ((User) result).name.equals("John") &&
- ((User) result).isAdmin() &&
- !((User) result).isBanned()) {
- System.out.println("Деериализованный объект совпадает с оригинальным");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement