Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Serializacja i deserializacja Redis

co powoduje problemy z deserializacją?

Zanim odpowiem na Twoje pytanie, chciałbym przedstawić Ci pewne tło,

Środowisko uruchomieniowe serializacji kojarzy z każdą klasą podlegającą serializacji numer wersji o nazwie serialVersionUID, który jest używany podczas deserializacji w celu sprawdzenia, czy nadawca i odbiorca serializowanego obiektu mają załadowane klasy dla tego obiektu, które są zgodne z serializacją. Jeśli odbiorca załadował klasę dla obiektu, który ma inny serialVersionUID niż odpowiednia klasa nadawcy, deserializacja spowoduje wystąpienie InvalidClassException.

Jeśli klasa możliwa do serializacji nie deklaruje jawnie serialVersionUID, środowisko uruchomieniowe serializacji obliczy domyślną wartość serialVersionUID dla tej klasy na podstawie różnych aspektów klasy. Używa następujących informacji o klasie do obliczenia SerialVersionUID,

  1. Nazwa klasy.
  2. Modyfikatory klasy zapisane jako 32-bitowa liczba całkowita.
  3. Nazwa każdego interfejsu posortowana według nazwy.
  4. Dla każdego pola klasy posortowanego według nazwy pola (z wyjątkiem prywatnych pól statycznych i prywatnych pól przejściowych:
  5. Nazwa pola.
  6. Modyfikatory pola zapisane jako 32-bitowa liczba całkowita.
  7. Deskryptor pola.
  8. jeśli istnieje inicjator klasy, napisz:

    Nazwa metody, .

    Modyfikator metody, java.lang.reflect.Modifier.STATIC, zapisany jako 32-bitowa liczba całkowita.

    Deskryptor metody, ()V.

  9. Dla każdego nieprywatnego konstruktora posortowanego według nazwy metody i podpisu:

    Nazwa metody, .

    Modyfikatory metody zapisane jako 32-bitowa liczba całkowita.

    Deskryptor metody.

  10. Dla każdej metody nieprywatnej posortowanej według nazwy i podpisu metody:

    Nazwa metody.

    Modyfikatory metody zapisane jako 32-bitowa liczba całkowita.

    Deskryptor metody.

Aby odpowiedzieć na Twoje pytanie,

Czy usunięcie własności publicznej/prywatnej spowoduje problem? Może dodanie nowych nieruchomości? Czy dodanie nowej funkcji do klasy spowodowałoby problemy? A może więcej konstruktorów?

Tak, wszystkie te dodatki/usunięcia domyślnie spowodują problem.

Ale jednym ze sposobów na przezwyciężenie tego jest jawne zdefiniowanie SerialVersionUID, co powie systemowi serializacji, że wiem, że klasa będzie ewoluować (lub ewoluować) z biegiem czasu i nie zgłosi błędu. Tak więc system deserializacji odczytuje tylko te pola, które są obecne po obu stronach i przypisuje wartość. Nowo dodane pola po stronie deserializacji otrzymają wartości domyślne. Jeśli niektóre pola zostaną usunięte po stronie deserializacji, algorytm po prostu czyta i pomija.

Oto sposób, w jaki można zadeklarować SerialVersionUID,

private static final long serialVersionUID = 3487495895819393L;



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. O prefiksie char b w kliencie Python3.4.1 połącz się z redis

  2. Jak najłatwiej znaleźć największe obiekty w Redis?

  3. Jak debugować polecenie błędu OOM niedozwolone, gdy używana pamięć> „maxmemory” w Redis?

  4. Jedi, nie można uzyskać połączenia jedis:nie można uzyskać zasobów z puli

  5. Jak wygasnąć klucz podrzędny HSET w redis?