2016-03-23 2 views
1

Test Класс сериализовать выглядит следующим образом:десериализации только необходимые поля в Java

public Class Test implements Serializable { 
     private static final long serialVersionUID = GENERATED_LONG_VALUE; 
     private int val; 
     private SomeClass_1 val_1; 
     private SomeClass_2 val_2; 
     private SomeClass_3 val_3; 
     // getter and setter for above 
    } 

Я сериализован Объект указанного класса как BLOB в таблице.

Теперь при десериализации я просто хочу val и val_1. Итак, я переопределил метод readObject() в тестовом классе, как показано ниже.

private void readObject(java.io.ObjectInputStream stream) 
     throws IOException, ClassNotFoundException { 

     this.val = (int) stream.readObject(); 
     this.val_1 = (SomeClass_1) stream.readObject(); 
    } 

Но после того, как это также, он делает stream.readObject() для val_3 и val_4. Я не понимаю, почему это происходит, даже я не читаю val_3 и val_4 в stream.readObject().

P.S. Я делаю сериализацию на server X, десериализуя его на server Y и класс Структура точно такая же, как и у server Y, как server X.

+3

Объявите переменные, которые вы не хотите сериализовать [ 'transient'] (http://stackoverflow.com/a/910522/2398375) –

+0

Я попробовал этот подход тоже, но он не работает. – Dhairyashil

+0

@VinceEmigh: при сериализации я использовал все поля, а десериализую мне нужны только первые 2 поля для восстановления. не в других областях. но все же он предназначен для обработки других полей. – Dhairyashil

ответ

2

Если один сервер X требует, чтобы все элементы объекта должны быть переданы ему, но сервер Y не произойдет, вы можете:

  1. Посмотрите в Externalization. Это дает вам полный контроль над сортировкой и разборчивостью, что похоже на то, что вам нужно.

  2. Отправлять серверам разные proxy objects: один, который сериализует все поля, а другой - нет. Вы можете создать прокси для данных, которые должны быть отправлены на серверы, передавая объект, который вы хотите отправить. Один прокси использует transient, другой - нет.

  3. Не отправляйте объекты, а не данные, необходимые для восстановления объектов с другой стороны. Это снимает нагрузку на сеть, если объекты, которые вы хотите отправить, не требуют большого количества данных.

+0

Могу ли я выполнять сериализацию с помощью java.io.Serializable и десериализации с использованием java.io.Externalizable? Потому что я не могу удалить уже сериализованные данные в БД, и я хочу вернуть его на 'сервер Y'. – Dhairyashil

+0

@Dhairyashil Я никогда не пробовал, но у меня такое чувство, которое может привести к проблемам, поскольку «Serializable» использует определенный алгоритм для сортировки данных и, не следуя одной и той же системе с обеих сторон соединения, может привести для утечек. Это предположение, я на самом деле не пробовал это сам, и я не мог найти статей или документации по этому вопросу.Могут быть safegaurds для предотвращения проблем, но единственный способ узнать, с моей точки зрения, - попробовать его и контролировать сеть (если не возникло никаких логических проблем). –

+0

@Dhairyahil В зависимости от того, сколько сериализованных данных вы в настоящее время управляете, вы всегда можете их прочитать, а затем выберете с помощью экстернализации, чтобы обеспечить совместимость ваших систем. Если это слишком большая проблема, не стесняйтесь выбирать второй вариант, который я предоставил, что я считаю необходимым, чтобы помочь вашей ситуации. –

Смежные вопросы