通过J2ME或BlackBerry API进行序列化

时间:2010-03-15 17:11:07

标签: serialization blackberry java-me

是否可以使用J2ME或BlackBerry API将对象序列化为字符串或字节数组?

感谢。

4 个答案:

答案 0 :(得分:6)

我处理对象序列化案例的方法是实现我自己的基础架构来处理所有事情。你没有在这个API中有反射,但你确实有“Class.forName()”,它比什么都好。所以这就是我做的......

首先,这是我拥有每个可序列化对象的接口:

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

serialize()方法将对象的字段写入DataOutput实例,而deserialize()方法则从DataInput实例设置对象的字段。 (这些都是面向数据的I / O流使用的普通顶级接口,这使我具有更大的灵活性)此外,任何实现此接口的类都需要具有默认的无参数构造函数。当然,如果您希望序列化类对变更具有可靠性,那么您可能需要相应地选择基础数据格式。 (例如,我实现了一个可序列化的哈希表作为处理这些情况的底层容器)

现在,为了实际序列化实现此接口的类,我有一个看起来像这样的方法:

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;
}

答案 1 :(得分:2)

遗憾的是,Java ME没有任何用于序列化的内置API,所以你必须自己发明一些东西。

答案 2 :(得分:2)

如果您的目标是序列化对象或对象图以保持闪存,则可以使用PersistentStore类。许多本机对象类型(如布尔,字节,字符,整数,长整型,对象,短,字符串,向量,哈希表)都是隐式可持久的。

答案 3 :(得分:1)

您很难为类创建自己的序列化过程。创建自己的基类然后使用一些反射来自动序列化属性并不太困难。

    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();