如何在不丢失太多信息的情况下将对象压缩为字符串

时间:2014-10-08 09:49:14

标签: java compression text-files lossless-compression

试图弄清楚如何创建一个可以根据文本文件创建对象的类。如果接口Readable具有String asString()方法,并且类中的Readable read(String s)方法是基于字符串s构造一个Readable对象,那么(read(String s).asString())。 equals(s),如果写入/读取的Readable类型只有原始参数,我已经能够轻松地使用反射写入读取,但是我不知道如何编写它们以便在构造函数时轻松转换为字符串和从字符串转换以任意顺序获取任意数量的可读类。对于仅使用基元,asString方法如下所示:

private int n, double d;
...
public String asString(){
    return "@"+getClass().getName()+"#i%d#"+this.n+"%"+this.d;
}

符号是任意字符,允许我使用String.split,而i和d给出字段n和d的基本类型,因为Class.forName不适用于基元。这个问题要求我有大约7层嵌套的Readables,但是,其中一些容器具有任意数量的Readables。我理解如何基于字符串编写read方法,但是如何在保留所有必要信息的同时将对象压缩为字符串?

2 个答案:

答案 0 :(得分:2)

这可以使用Java API完成:ObjectOutputStreamObjectInputStream

您的类需要实现java.io.Serializable接口以写入流/从流创建。

实施例

public class WriteMe implements java.io.Serializable {
    private static final long serialVersionUID = 1234567890L; // Should be generated

    private int myInt = 164;
    private Date myDate = new Date();
    private transient int money = 1648; // Will be ignored
}

在您的主要课程中:

public class HelloStackoverflow {
    public static void main(String[] args) {
        ObjectOutputStream os = new ObjectOutputStream(System.out); // Print to standard output
        os.writeObject(new WriteMe());
    }
}

您可以对ObjectInputStream和.readObject()执行相同的操作。

如果要将对象存储为String,则应使用Base64对其进行编码,因为输出将为Java-Bytecode!

答案 1 :(得分:0)

正如泰特斯已经说过的那样 - 为什么再次发明轮子。 使用ObjectOutputStream和ObjectInputStream,java已经有了这样的机制