Нахождение serialVersionUID сериализованного объекта

Главный контрольно-пропускной пункт для Java, который Webstart, вероятно, что все еще необходимо было установить JVM, прежде чем это сможет даже попытаться загрузить и запустить приложение. У всех есть браузер. Не у всех есть JVM.

Редактирование: я с тех пор получил некоторый практический опыт webstart и могу теперь добавить эти две точки:

  • сценарий Инструментария Развертывания и построенная из модулей JVM, выпущенная где-нибудь вокруг Java 1.6u10, делают требование JVM менее проблематичным, так как это может автоматически загрузить JVM и ядро API и запустить хитрость программы, загружающую остальных.
  • веб-Запуск серьезно ошибочен. Даже среди выпусков Java 1.6 был тот, который загрузил целое приложение каждый раз и другой, который загрузил его и затем перестал работать с неясным сообщением об ошибке. В целом, я не могу действительно рекомендовать полагаться на такую хрупкую систему.

19
задан Daniel Fortunov 15 September 2009 в 11:04
поделиться

5 ответов

Вы можете сделать это, расширив ObjectInputStream :

public class PrintUIDs extends ObjectInputStream {

  public PrintUIDs(InputStream in) throws IOException {
    super(in);
  }

  @Override
  protected ObjectStreamClass readClassDescriptor() throws IOException,
      ClassNotFoundException {
    ObjectStreamClass descriptor = super.readClassDescriptor();
    System.out.println("name=" + descriptor.getName());
    System.out.println("serialVersionUID=" + descriptor.getSerialVersionUID());
    return descriptor;
  }

  public static void main(String[] args) throws IOException,
      ClassNotFoundException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    List<Object> list = Arrays.asList((Object) new Date(), UUID.randomUUID());
    oos.writeObject(list);
    oos.close();
    InputStream in = new ByteArrayInputStream(baos.toByteArray());
    ObjectInputStream ois = new PrintUIDs(in);
    ois.readObject();
  }

}

Я считаю, что можно было бы прочитать все сериализованные данные, заменив дескриптор, возвращаемый методом, но я не пробовал.

12
ответ дан 30 November 2019 в 02:13
поделиться

С сериализованными битами связаны метаданные (заголовок, если хотите). Вы можете прочитать значение из метаданных, если знаете, в какой позиции оно находится ( SerialVersionUID записывается там вместе с другой информацией, такой как имя класса).

Думаю, эта статья может вам помочь: Обнаружен алгоритм сериализации Java .

Обратите внимание, что биты записываются «в открытом виде» (если вы не зашифровали поток явно), так что HEX-редактор может быть всем, что вам нужно, чтобы увидеть, что такое SerialVersionUID .

5
ответ дан 30 November 2019 в 02:13
поделиться

Есть простой способ узнать serialversionUID класса-

Предположим, у вас есть класс, в котором вы забыли упомянуть serialversionUID-

import java.io.Serializable;

public class TestSerializable implements Serializable {

}

Just do this-

serialver -classpath . TestSerializable

This prints-

static final long serialVersionUID = 5832063776451490808L;

serialver - это утилита, которая поставляется вместе с JDK

22
ответ дан 30 November 2019 в 02:13
поделиться

Это именно то, что вам нужно сделать - указать свой собственный static final long serialVersionUID .

В документации для Serializable есть соответствующий раздел. .

Если вы не указали serialVersionUID , я не верю, что есть простой способ получить его, кроме расшифровки потока, как предлагает @WMR.

0
ответ дан 30 November 2019 в 02:13
поделиться

Существует определенная грамматика для сериализации объектов:

См. Главу 6.4 в http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html

Используя это, вы сможете определить SerialVersionUID вашего сериализованного объекта.

1
ответ дан 30 November 2019 в 02:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: