Сериализация через API J2ME или BlackBerry - PullRequest
3 голосов
/ 15 марта 2010

Можно ли сериализовать объект в строку или байтовый массив с помощью API J2ME или BlackBerry?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 16 марта 2010

Способ обработки случая сериализации объекта заключается в реализации собственной инфраструктуры для обработки всего. У вас нет отражения в этом API, но у вас есть «Class.forName ()», который лучше, чем ничего. Вот что я делаю ...

Во-первых, это интерфейс, который есть у каждого реализуемого сериализуемого объекта:

public interface Serializable {
    void serialize(DataOutput output) throws IOException;
    void deserialize(DataInput input) throws IOException;
}

Метод serialize () записывает поля объекта в экземпляр DataOutput, а метод deserialize () устанавливает поля объекта из экземпляра DataInput. (это оба простые интерфейсы верхнего уровня, используемые ориентированными на данные потоками ввода / вывода, что позволяет мне иметь большую гибкость). Кроме того, любой класс, реализующий этот интерфейс, должен иметь конструктор по умолчанию без аргументов. Конечно, если вы хотите, чтобы ваш сериализованный класс был устойчивым к изменениям, вы можете выбрать соответствующие форматы данных. (например, я реализовал сериализуемую хеш-таблицу как базовый контейнер для обработки этих случаев)

Теперь, чтобы фактически сериализовать класс, реализующий этот интерфейс, у меня есть метод, который выглядит примерно так:

public static byte[] serializeClass(Serializable input) {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    DataOutputStream output = new DataOutputStream(buffer);
    try {
        output.writeUTF(input.getClass().getName());
        input.serialize(output);
    } catch (IOException ex) {
        // do nothing
    }
    return buffer.toByteArray();
}

И для десериализации:

public static Serializable deserializeClass(byte[] data) {
    DataInputStream input = new DataInputStream(new ByteArrayInputStream(data));
    Object deserializedObject;
    Serializable result = null;
    try {
        String classType = input.readUTF();
        deserializedObject = Class.forName(classType).newInstance();
        if(deserializedObject instanceof Serializable) {
            result = (Serializable)deserializedObject;
            result.deserialize(input);
        }
    } catch (IOException ex) {
        result = null;
    } catch (ClassNotFoundException ex) {
        result = null;
    } catch (InstantiationException ex) {
        result = null;
    } catch (IllegalAccessException ex) {
        result = null;
    }
    return result;
}
2 голосов
/ 15 марта 2010

Если ваша цель - сериализовать объект или граф объектов для сохранения во флэш-памяти, вы можете использовать класс PersistentStore . Многие собственные типы объектов, такие как логические, байтовые, символьные, целочисленные, длинные, объектные, короткие, строковые, векторные, хэш-таблицы, неявно сохраняются.

2 голосов
/ 15 марта 2010

Java ME, к сожалению, не имеет встроенных API для сериализации, поэтому вам придется что-то придумывать самостоятельно.

1 голос
/ 16 марта 2010

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

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    DataOutputStream outputStream = new DataOutputStream(baos);
    try {
        // serialize your object - 
        outputStream.writeInt(this.name);
        // Then push the player name.
        outputStream.writeUTF(this.timestamp);
    }
    catch (IOException ioe) {
        System.out.println(ioe);
        ioe.printStackTrace();
    }


// Extract the byte array
byte[] b = baos.toByteArray();
...