Главный контрольно-пропускной пункт для Java, который Webstart, вероятно, что все еще необходимо было установить JVM, прежде чем это сможет даже попытаться загрузить и запустить приложение. У всех есть браузер. Не у всех есть JVM.
Редактирование: я с тех пор получил некоторый практический опыт webstart и могу теперь добавить эти две точки:
Вы можете сделать это, расширив 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();
}
}
Я считаю, что можно было бы прочитать все сериализованные данные, заменив дескриптор, возвращаемый методом, но я не пробовал.
С сериализованными битами связаны метаданные (заголовок, если хотите). Вы можете прочитать значение из метаданных, если знаете, в какой позиции оно находится ( SerialVersionUID
записывается там вместе с другой информацией, такой как имя класса).
Думаю, эта статья может вам помочь: Обнаружен алгоритм сериализации Java .
Обратите внимание, что биты записываются «в открытом виде» (если вы не зашифровали поток явно), так что HEX-редактор может быть всем, что вам нужно, чтобы увидеть, что такое SerialVersionUID
.
Есть простой способ узнать 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
Это именно то, что вам нужно сделать - указать свой собственный static final long serialVersionUID
.
В документации для Serializable есть соответствующий раздел. .
Если вы не указали serialVersionUID
, я не верю, что есть простой способ получить его, кроме расшифровки потока, как предлагает @WMR.
Существует определенная грамматика для сериализации объектов:
См. Главу 6.4 в http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html
Используя это, вы сможете определить SerialVersionUID вашего сериализованного объекта.