2014-01-18 106 views
3

我需要将具有其所有属性的对象保存到文件中。将对象保存到文件

我不允许改变对象的类别。 对象是不可序列化的。 那么我怎样才能将对象保存到文件以备后用?

+0

我很难解释。 我只是有一个对象,需要将其保存到磁盘。 – xDarcade

+1

Upvoted无谓的无法解释的downvote。这些评论的质量令人沮丧。我不明白为什么人们评论他们不明白的东西,或者他们不知道他们在说什么。 – EJP

+0

@StefanoSanfillipo唯一需要的链接是我认为在一个评论而不是两个评论中都提到他们。也许你可以停止挑剔,并学习关于这个主题的话题。否则你在这里的存在是莫名其妙的。 – EJP

回答

2

如果对象符合Java Bean规范(不同于Serializable要求),则可以使用java.beans.XMLEncoder。

+0

该OP特别说他/她的对象是不可序列化的。 JavaBeans规范要求§5.5中的“所有bean必须支持序列化或外部化”,所以他/她的对象不符合Java Bean规范。 –

+0

@StefanoSanfillipo尽管如此,你也可以通过查看它或者自己尝试它来发现它,而不是对你一无所知的事物进行疯狂的声明,但是没有像使用该编码器的可序列化那样的要求。 – EJP

+0

我只是想通过留言来帮助您更准确地回答这个问题。如果你认为这是挑剔,我很抱歉。我承认我没有调查这种方法,但是我看到了一种不协调的情况,我想让你知道。 –

2

如果您正在避免默认的java序列化,则有两个选项。

您可以编写一个自定义写入器和读取器,在其中将msnually写入文件的值。您也可以有读取文件并返回对象的阅读器。这是很多工作,不值得。

另一种选择是使用JSON或XML序列化库(不使用java序列化)。

例如:http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

0

保存在一个文件中的对象意味着节约其状态,字段。你可以试试java.io.DataOutputStream,它有所有必要的方法来保存任何原始类型和字符串。您稍后可以通过从java.io.DataInputStream的文件中读取其字段来重新创建该对象。它取决于对象类,但如果对象不是一个bean,也就是说它不允许读取/设置它的字段,你仍然可以尝试使用反射来访问它的字段。

0

它不适用于所有情况,但您可以使用ObjectOutputStream

假设您的类Foo不可序列化。创建另一个FooState包含一个Foo实例状态

public class Foo { 
    private String string; 
    private Date date; 
    /* ... */ 
} 

public class FooState { 
    private String string; 
    private Date date; 

    public FooState(Foo foo) { 
     this.string = foo.getString(); 
     this.date = foo.getDate(); 
     /* ... */ 
    } 

    private Object readResolve() throws ObjectStreamException { 
     return new Foo(string, date, ...); 
    } 
} 

然后子类ObjectOutputStream。通过这个类,可以透明地用一个序列化的序列化和反序列化替换一个不可序列化的对象。

public class FooObjOutputStream extends ObjectOutputStream { 
    public FooObjOutputStream(OutputStream out) throws IOException { 
     super(out); 
     enableReplaceObject(true); 
    } 

    protected FooObjOutputStream() throws IOException, SecurityException { 
     super(); 
     enableReplaceObject(true); 
    } 

    @Override 
    protected Object replaceObject(Object obj) throws IOException { 
     if (obj instanceof Foo) { 
      return new FooState((Foo) obj); 
     } else { 
      return super.replaceObject(obj); 
     } 
    } 
} 

然后进行序列化/反序列化

private static byte[] serialize(Object o) throws Exception { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    FooObjOutputStream oos = new FooObjOutputStream(baos); // Magically handling Foo objects 
    oos.writeObject(o); 
    oos.flush(); 
    oos.close(); 
    return baos.toByteArray(); 
} 

public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 
    ObjectInputStream ois = new ObjectInputStream(bais); 
    Object o = ois.readObject(); 
    bais.close(); 
    return o; 
} 
0

如果你被允许使用第三方库,你可以尝试使用序列化库像Kryo