【问题标题】:Saving Java objects into files将 Java 对象保存到文件中
【发布时间】:2013-06-12 03:17:47
【问题描述】:

我在 Java 中有以下课程。我希望能够将其保存为能够在不同电脑上移动的通用文件格式。我知道对象序列化,但我想知道我的其他选择是什么,它们各自的优缺点是什么。谢谢!例如,序列化文件不是人类可读的,因此是一个骗局。

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 serialization file-io save


【解决方案1】:

您可以使用例如将对象序列化为JSON Jackson,这将大大提高它们的人类可读性

【讨论】:

    【解决方案2】:

    对于 Json,使用 GSON...

    它支持任意复杂的对象,您不需要 setter 或 getter。 Gson 只是想通了。

    转换为 JSON

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

    从 JSON 转换

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

    【讨论】:

    • 非常感谢!但是现在它是一个字符串,我应该将它保存到文本文件中吗?
    • 你可以做任何你想做的事情,序列化为json文件,它将是可移植和可读的,以这种形式。
    【解决方案3】:

    您可以使用java.beans.XMLEncoder 生成您的javabean 的XML。 查看一个教程here

    生成的一个 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>
    

    【讨论】:

      【解决方案4】:

      JAXB 根​​据注释对对象进行编组和解组。注释允许您:

      • 控制序列化格式。
      • 将序列化格式与代码的某些重构隔离开来。
      • 标识要从序列化中排除的字段。

      这是Oracle tutorial on JAXB

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

      @XmlRootElement(name="foo")
      @XmlAccessorType(XmlAccessType.FIELD)
      public class Foo {
      
          @XmlTransient
          private String m_temp; 
      
          @XmlAttribute(name="fieldA")
          private String fieldA;
      
          ...
      }
      

      【讨论】:

        【解决方案5】:

        看看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 内容如下所示:

        <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>
        

        这是最简单的例子,你可以针对更复杂的情况做很多自定义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-26
          • 2017-06-29
          • 2013-12-27
          • 2016-04-21
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 2019-05-19
          相关资源
          最近更新 更多