从反序列化的文件中读取字节

时间:2012-10-11 07:28:45

标签: java serialization deserialization

我正在学习this tutorial之后的Java序列化。我已成功读取并使用了序列化文件中的对象,其中包含以下代码(省略了导入):

public class SimpleSerializationTest {
static class Person implements Serializable{
    String name;
    int age;
    boolean isMale;

    static final long serialVersionUID = 314L;
}

public static void main(String[] args) throws Exception{
    Person p = new Person();
    p.name = "Mark";
    p.age = 20;
    p.isMale = true;

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("mark.ser"));

    try{
        oos.writeObject(p);
    } catch(IOException ioe){
        ioe.printStackTrace();
    } finally{
        oos.close();
    }

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("mark.ser"));

    try{
        // NOTE: Will change this later!
        Person mark = (Person) ois.readObject();
        System.out.println(mark.name);
    } catch(IOException ioe){
        ioe.printStackTrace();
    } finally{
        ois.close();
    }
}
}

但是,我将序列化对象的主要目的是将其推送到Redis商店。所以,为此,我不需要它们以Object形式,而是以字节形式。所以我将最终try-block的内容更改为......

while(true){
   try{
        System.out.println(ois.readByte());
    } catch(EOFException eofe){
        eofe.printStackTrace();
        break;
    }
}

但是这会立即引发EOFException。有什么我做错了吗?

2 个答案:

答案 0 :(得分:3)

标记了对象流。这意味着如果您将一个不同类型的信息读取到它所期望的那个信息会导致EOFException,而不是像IllegalStateException那样带有适当错误消息的更有意义的信息。

如果你想要一个ObjectOutputStream写的字节,最简单的方法就是只使用内存。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream ois = new ObjectOutputStream(baos);
ois.writeObject(object);
ois.close();
byte[] bytes = baos.toByteArray();

答案 1 :(得分:0)

如果要将实例推送到redis,则可以使用JRedis

来自documents的示例代码。

// instance it
SimpleBean obj = new SimpleBean ("bean #" + i);

// get the next available object id from our Redis counter using INCR command
int id = redis.incr("SimpleBean::next_id")

// we can bind it a unique key using map (Redis "String") semantics now
String key = "objects::SimpleBean::" + id;

// voila: java object db
redis.set(key, obj);

// and lets add it to this set too since this is so much fun
redis.sadd("object_set", obj);