【问题标题】:Is it possible to store object to property file in Java?是否可以将对象存储到 Java 中的属性文件?
【发布时间】:2016-06-13 17:33:50
【问题描述】:

今天我尝试使用java.util.properties 存储Object。我看到很多例子只是使用StringInteger。这是一个例子:

public static void main(String[] args) {
    Properties prop = new Properties();

    // add some properties
    prop.setProperty("Height", "200");
    prop.put("Width", "1500");

    // print the list 
    System.out.println("" + prop);
    try {
        // store the properties list in an output stream
        prop.store(System.out, "config.properties");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

那么是否可以将Object 存储在properties 文件或xml 文件中?

【问题讨论】:

标签: java file object text


【解决方案1】:

首先要存储一个对象,你应该将它序列化为一个字节数组,然后用Base64 encoder对其进行编码:

public static String toString(Object o) throws IOException {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);) {
        oos.writeObject(o);
        return new String(Base64Coder.encode(baos.toByteArray()));
    }
}

然后就可以安全的存储到属性文件中了:

prop.put("object.instance", toString(o));

要从属性中读取对象,请使用以下函数:

public static Object fromString(String s) throws IOException, ClassNotFoundException {
    byte[] data = Base64Coder.decode(s);
    Object o;
    try (ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data))) {
        o = ois.readObject();
    }
    return o;
}

你可以从字符串中反序列化对象:

Object o = fromString(prop.get("object.instance"));

【讨论】:

  • 谢谢。我会试试这个。
  • 这显然是一个非常糟糕的方法,因为如果有人在中间添加一个小字符,您将无法读取属性文件中的内容,您就死了
  • @Nicolas Filotto 这不是问题,您可以添加一些错误处理来处理不可读的值,如果序列化对象被用户破解,则返回 null。任何其他属性都可能被用户弄乱。你不能消除它。我认为这是最好的方法之一。
  • @JHead 损坏后如何恢复?正如我所说,你已经死了
  • @NicolasFilotto 如果用户删除了整个属性文件,你如何恢复?如果文件是可写的并且用户破坏了它,那么用户破坏了它。此时格式并不重要。
【解决方案2】:

没有,因为它在 Javadoc 中声明:

如果在“受损”属性上调用 storesave 方法 包含非字符串键或值的对象,调用将失败。

如果您确实需要将对象存储到 Properties 中,您可以将其转换为 JSON,因为它是人类可读的众所周知的格式,因此如果有人在中间添加错误字符,您可以还是修吧。

这是使用ObjectMapper 的方法:

Properties prop = new Properties();

ObjectMapper mapper = new ObjectMapper();
// Convert my object foo into JSON format and put it into my Properties object
prop.put("myObj",  mapper.writeValueAsString(foo));

StringWriter output = new StringWriter();
// Store my properties
prop.store(output, null);

prop = new Properties();
// Load my properties
prop.load(new StringReader(output.toString()));

// Parse my object foo from the value of my new Properties object
Foo foo2 = mapper.readValue(prop.getProperty("myObj"), Foo.class);

Here 是一个很好的教程,它详细解释了如何使用ObjectMapper

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2016-09-17
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多