В веб-приложении каждая задача выполняется в виде запроса и ответа.
Программирование на стороне клиента - это HTML-код с Java-скриптом и его фреймворками, библиотеки выполняются в Internet Explorer, Mozilla, Chrome-браузерах. В сценарии Java-сценария серверные сервлеты программирования выполняются в Tomcat, web-логике, j боссе, WebSphere severs
Как заметил еще один, глава 11 Эффективной Java Джоша Блоха является незаменимым ресурсом в Java Serialization.
Пара вопросов, относящихся к этой главе, относящейся к вашему вопросу:
Я написал приведенный ниже пример, иллюстрирующий это.
class MyClass extends MyClass2 implements Serializable{
public MyClass(int quantity) {
setNonSerializableProperty(new NonSerializableClass(quantity));
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
// note, here we don't need out.defaultWriteObject(); because
// MyClass has no other state to serialize
out.writeInt(super.getNonSerializableProperty().getQuantity());
}
private void readObject(java.io.ObjectInputStream in)
throws IOException {
// note, here we don't need in.defaultReadObject();
// because MyClass has no other state to deserialize
super.setNonSerializableProperty(new NonSerializableClass(in.readInt()));
}
}
/* this class must have no-arg constructor accessible to MyClass */
class MyClass2 {
/* this property must be gettable/settable by MyClass. It cannot be final, therefore. */
private NonSerializableClass nonSerializableProperty;
public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) {
this.nonSerializableProperty = nonSerializableProperty;
}
public NonSerializableClass getNonSerializableProperty() {
return nonSerializableProperty;
}
}
class NonSerializableClass{
private final int quantity;
public NonSerializableClass(int quantity){
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
}
XStream - отличная библиотека для быстрой сериализации Java для XML для любого объекта независимо от того, является ли она Serializable или нет. Даже если целевой формат XML вам не подходит, вы можете использовать исходный код, чтобы узнать, как это сделать.
Выпущено несколько возможностей и я возобновил их здесь:
Вы можете начать с поиска ключевого слова transient , которое помечает поля как не относящиеся к постоянному состоянию объекта.
Вам нужно будет реализовать writeObject()
и readObject()
и выполнить ручную сериализацию / десериализацию этих полей. Подробнее см. На странице javadoc для java.io.Serializable
. Эффективный Java Josh Bloch также имеет некоторые хорошие главы по внедрению надежной и безопасной сериализации.
MyClass2 - это просто интерфейс, поэтому он не имеет свойств, а только методов. Если у вас есть переменные экземпляра, которые сами по себе не являются сериализуемыми, единственный способ, которым я знаю, чтобы обойти это, - объявить эти поля переходными.
ex:
private transient Foo foo;
Когда вы объявляете переходный период поля, он будет игнорироваться во время процесса сериализации и десериализации. Имейте в виду, что при десериализации объекта с переходным полем значение поля всегда будет по умолчанию (обычно null.)
Обратите внимание, что вы можете также переопределить метод readResolve () вашего класса, чтобы инициализировать переходные поля на основе другого состояния системы.
Если возможно, несериализуемые части могут быть установлены как переходные
private transient SomeClass myClz;
В противном случае вы можете использовать Kryo . Kryo - это быстрая и эффективная структура сериализации графа объектов для Java (например, JAVA-сериализация java.awt.Color требует 170 байт, Kryo всего 4 байта), которая может сериализовать и несериализуемые объекты. Kryo также может выполнять автоматическое глубокое и мелкое копирование / клонирование. Это прямое копирование из объекта в объект, а не object->bytes->object
.
Вот пример использования kryo
Kryo kryo = new Kryo();
// #### Store to disk...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
// ### Restore from disk...
Input input = new Input(new FileInputStream("file.bin"));
SomeClass someObject = kryo.readObject(input, SomeClass.class);
input.close();
Сериализованные объекты также могут быть сжаты путем регистрации точного сериализатора:
kryo.register(SomeObject.class, new DeflateCompressor(new FieldSerializer(kryo, SomeObject.class)));
Зависит от того, почему этот член MyClass2 не является сериализуемым.
Если есть какая-то веская причина, почему MyClass2 не может быть представлен в сериализованной форме, то, вероятно, по той же причине применимы к MyClass, поскольку это подкласс.
Возможно, можно написать пользовательскую сериализованную форму для MyClass, реализовав readObject и writeObject таким образом, чтобы состояние данных экземпляра MyClass2 в MyClass можно было соответствующим образом воссоздать из сериализованного данные. Это был бы путь, если бы API MyClass2 был исправлен, и вы не можете добавить Serializable.
Но сначала вы должны выяснить, почему MyClass2 не является сериализуемым и, возможно, его изменить.
Полезный подход для сериализации экземпляров несериализуемых классов (или, по крайней мере, подклассов) известен Serial Proxy. По сути, вы выполняете writeReplace, чтобы возвращать экземпляр совершенно другого сериализуемого класса, который реализует readResolve для возврата копии исходного объекта. Я написал пример сериализации java.awt.BasicStroke в Usenet
Если вы можете изменить MyClass2, самый простой способ обратиться к этому - объявить переходный ресурс.