将Java对象保存到文件中

4

我有一个Java类。我想将其保存为通用文件格式,以便在不同的电脑之间传输。我知道对象序列化,但我想知道其他选项及其各自的优缺点。例如,序列化文件不适合人类阅读,这是一个缺点。谢谢!

尽管对象序列化是一种可行的方法,但它确实存在上述缺点。您可以考虑使用XML或JSON这样的基于文本的格式来存储您的Java对象。这些格式易于阅读和编辑,并且与各种编程语言兼容。但是,它们可能会占用更多的空间并且稍微慢一些。另外,如果您需要更严格的数据类型控制,则可以使用Protocol Buffers或Thrift等二进制格式。

public class NervousSystem {
    private CentralNervousSystem CNS;
    private PeripheralNervousSystem PNS;

    public NervousSystem(Neocortex neocortex, LateralGeniculateNucleus LGN, Retina retina) {
        this.CNS = new CentralNervousSystem(neocortex, LGN);
        this.PNS = new PeripheralNervousSystem(retina);
    }

    public CentralNervousSystem getCNS() {
        return this.CNS;
    }

    public PeripheralNervousSystem getPNS() {
        return this.PNS;
    }
}

你可以查看Java Architecture for XML Binding - MadProgrammer
5个回答

8
你可以使用例如Jackson这样的工具将对象序列化为JSON,这将极大地提高它们的可读性。

5

对于 Json,使用GSON...

GSON 支持任意复杂的对象,并且您不需要使用 setter 或 getter。 Gson 只需自动处理所有细节。

转换为 JSON

Gson gson = new Gson();
String myObjectJson = gson.toJson( myObj);
println myObjectJson 

从JSON转换

MyObj obj = gson.fromJson(myObjectJson, MyObj.class)

非常感谢!但是现在它变成了一个字符串,我应该将它保存到文本文件中或者其他什么地方吗? - letter Q
你可以随心所欲地进行操作,以 JSON 格式将数据序列化到文件中,这样就能够方便地传输和阅读。 - raffian

4
您可以使用java.beans.XMLEncoder生成JavaBean的XML。在这里查看一个教程:点击这里
以下是生成的XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_10" class="java.beans.XMLDecoder">
 <object class="com.test.MyBean">
  <void property="myBoolean">
   <boolean>true</boolean>
  </void>
  <void property="myString">
   <string>xml is cool</string>
  </void>
  <void property="myVector">
   <object class="java.util.Vector">
    <void method="add">
     <string>one</string>
    </void>
    <void method="add">
     <string>two</string>
    </void>
    <void method="add">
     <string>three</string>
    </void>
   </object>
  </void>
 </object>
</java>

1
JAXB根据注解对对象进行编组和解组。这些注解允许您:
  • 控制序列化格式。
  • 将序列化格式与代码的某些重构隔离开来。
  • 标识要从序列化中排除的字段。

这里有一个Oracle关于JAXB的教程

例如,带注释的类可能如下所示:

@XmlRootElement(name="foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlTransient
    private String m_temp; 

    @XmlAttribute(name="fieldA")
    private String fieldA;

    ...
}

1

看一下xstream,这是一个简单且常用的Java XML序列化库。简单来说,它看起来像这样(例子来自xstream网站):

public class Person {
  private String firstname;
  private String lastname;
  private PhoneNumber phone;
  private PhoneNumber fax;
  // getters & setters
}

public class PhoneNumber {
  private int code;
  private String number;
  // getters & setters
}

XStream xstream = new XStream();
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
String xml = xstream.toXML(joe);

XML内容如下:

这是HTML代码:

<mypackage.Person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</mypackage.Person>

这是最简单的示例,您可以为更复杂的情况进行许多自定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接