通过J2ME或BlackBerry API进行序列化

Dan*_*ord 3 serialization blackberry java-me

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

谢谢.

小智 6

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

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

public interface Serializable {
    void serialize(DataOutput output) throws IOException;
    void deserialize(DataInput input) throws IOException;
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

并反序列化:

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;
}
Run Code Online (Sandbox Code Playgroud)