2017-02-21 77 views
0

В настоящее время я разрабатываю веб-приложение, и я хотел бы сделать объекты Java на сервере постоянными, чтобы их можно было восстановить в любое время. Поскольку база данных является излишним для моего приложения, я выбираю самый простой способ сохранения Java-объектов: сериализация в xml или байты. К сожалению, большая часть используемого кода - это классы Java, которые я не могу изменить, и эти классы не реализуют интерфейс «сериализуемый». Каковы мои возможности относительно сериализации объектов этих классов, а также других взаимодействующих объектов моих собственных классов?Java-сериализация несериализуемого класса третьей стороны

+1

Если вы можете подклассифицировать их и реализовать Serializable в дочернем классе, вы должны идти. Другой способ - реализовать собственный способ их сериализации. Ваш вопрос слишком широк, чтобы ответить на этот вопрос. Но в качестве короткого примера: Путь может быть сериализован как String, если он будет всегда десериализован одной машиной. Также обратите внимание, что классы, такие как java.io.Stream, просто не могут быть сериализованы. Вы должны найти способ для своего кода воссоздать Stream из чего-то другого. –

+0

Я думаю, что решение в моем случае - реализовать собственный способ сериализации объекта самостоятельно, предоставив мою собственную реализацию методов writeObject и readObject для Serializable inteface. Как бы вы предложили обернуть оригинальный класс третьей стороны? Расширяя этот класс или создавая новый класс, который ссылается на объект третьего класса? –

+0

Я бы пошёл для интерфейса 'Serializer ', который представлял бы два метода: 'Serializable toSerializable (T objectToSerialize)' и 'T fromSerializable (Serializable serializedObject)' с уникальными классами Serializable для каждого класса, который вам нужен для serialiaze.Затем заверните весь свой Serializer в SerializationService/Factory, который может найти свой путь в и из. Таким образом, у вас будет только промежуточный (DAO) уровень между вашими неэриализуемыми классами и вашими сериализованными файлами. –

ответ

1

Как я уже сказал в своих комментариях, я бы выбрал SerializationService, который нашел бы подходящий Serializer<T> для каждого объекта, который вы хотите сохранить.

Что-то вроде:

public interface Serializer<T> { 

Serializable toSerializable(T objectToSerialize); 

//to build a factory/service around it 
boolean canDeserialize(Serializable serializedObject); 

T fromSerializable(Serializable serializedObject); 

}

И если вы хотите, основной, конкретный пример: с довольно-общий Путь:

public class PathSerializer implements Serializer<Path> { 

@Override 
public Serializable toSerializable(Path objectToSerialize) { 
    return objectToSerialize.toString(); 
} 

@Override 
public Path fromSerializable(Serializable serializedObject) { 
    if(!canDeserialize(serializedObject)){ 
     throw new IllegalArgumentException("Cannot deserialize this"); 
    } 
    return Paths.get((String)serializedObject); 
} 

@Override 
public boolean canDeserialize(Serializable serializedObject) { 
    return serializedObject != null && serializedObject instanceof String; 
} 

}

Вы могли бы также очень хорошо хранит POJO, содержащий имя вашего исходного класса объекта и список параметров необходимо, чтобы в его конструкторе/или карта его полей была возможность регенерировать объекты путем отражения.

Все зависит от вас и сложности вашего приложения.

0

Я думаю, что JSON будет решением для решения проблемы. Возьмите, например, библиотеку Googles GSON. Вам не нужно аннотировать классы, просто написать

Gson gson = new Gson(); 
MyObj obj = gson.fromJson(jsonString); 
String json = gson.toJson(obj); 

Для получения более подробной информации о формате JSON см official JSON documentation.

0

Одним из вариантов было бы расширить классы, к которым у вас нет доступа, чтобы сохранить их внутреннее состояние и реализовать Serializable для них.

Более подробная информация по этому вопросу SO: Serializing a class variable which does not implement serializable

Кроме того, я не думаю, что есть какой-либо другой вариант, кроме строительства некоторых оберток и сериализации классы вручную XML или JSON.

+0

Не могли бы вы дать мне пример кода класса-оболочки, выполнив эту ручную серилизацию? Благодаря! –