Serialization 通过J2ME或BlackBerry API进行序列化

Serialization 通过J2ME或BlackBerry API进行序列化,serialization,blackberry,java-me,Serialization,Blackberry,Java Me,是否可以使用J2ME或BlackBerry API将对象序列化为字符串或字节数组 谢谢。不幸的是,Java ME没有任何用于序列化的内置API,因此您必须自己发明一些东西。如果您的目标是序列化对象或对象图以持久化到闪存,则可以使用该类。许多本机对象类型(如布尔、字节、字符、整数、长、对象、短、字符串、向量、哈希表)都是隐式持久化的。您必须为类创建自己的序列化过程。创建自己的基类,然后使用某种反射来自动序列化属性不会太困难 ByteArrayOutputStream baos = new

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


谢谢。

不幸的是,Java ME没有任何用于序列化的内置API,因此您必须自己发明一些东西。

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

您必须为类创建自己的序列化过程。创建自己的基类,然后使用某种反射来自动序列化属性不会太困难

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

我处理对象序列化情况的方法是实现我自己的基础结构来处理所有事情。在这个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;
}

除了J2ME不支持反射。我喜欢你使用DataOutputStream的想法,即使你不能通过反射自动完成。但是我如何加密这些数据呢?你是在尝试序列化以实现本地持久性吗?如果是这样,您可以保护对BlackBerry PersistentStore中存储的数据的访问。或者您是否有其他实际需要字节数组的用例?明白,是否可以在不单独加密/解密对象字段的情况下加密数据?我不这么认为-持久存储上的受保护访问模式可能会自动加密数据,但我所看到的RIM文档中没有一个是肯定的。RIM的一位技术人员证实,受保护的访问不会加密任何内容。谢谢,谢谢。你有一个我能看到的完整的工人阶级档案吗?另外,您是否知道是否可以使用Web服务的JSR172例程来生成所有这些信息?(我正在使用webservices向服务器传递数据,并通过PS存储对象)。这里提供了更复杂版本的所有代码:只需通过SVN浏览器搜索“org/logicprobe/LogicMail/”。“util”包有基础结构代码,“conf”包有一些我已经实现的类。我已经手工编写了所有代码,从RMS开始,转到PS,所以我不能说代码生成。但是我处理所有类型的数据。谢谢,里面有一些非常好的东西。你做了很多BB开发。