【问题标题】:How to serialize a generic class in Java?如何在 Java 中序列化泛型类?
【发布时间】:2013-05-31 07:42:55
【问题描述】:

我已经开始阅读 Java 中的序列化以及其他语言中的一些内容,但是如果我有一个泛型类并且我想将它的一个实例保存到文件中。

代码示例

public class Generic<T> {
  private T key;
  public Generic<T>() {
    key = null;
  }
  public Generic<T>(T key) {
    this.key = key;
  }
}

保存这种对象的最佳方法是什么? (当然在我真正的宗教课程中还有更多,但我只是想知道实际的想法。)

【问题讨论】:

  • 和其他类一样:让它实现Serializable接口:)
  • @sp00m:有时无法更改班级。可能不是这里的情况;)

标签: java generics serialization


【解决方案1】:

您需要像往常一样创建泛型类Serializable。

public class Generic&lt;T&gt; implements Serializable {...}

如果使用泛型类型声明字段,您可能希望指定它们应该实现Serializable。

public class Generic&lt;T extends Serializable&gt; implements Serializable {...}

请注意此处不常见的 Java 语法。

public class Generic&lt;T extends Something &amp; Serializable&gt; implements Serializable {...}

【讨论】:

  • 我更喜欢这个答案,因为我更容易将这个东西添加到我的班级......我已经准备好了......实现可序列化,但是当我尝试使用 ObjectOutputStream 保存时。我的程序只是冻结了。
  • 实现Serializable会破坏封装和信息隐藏;所有私有和包私有成员都成为类的导出 API 的一部分。这会引入潜在的安全漏洞,并可能使类更加脆弱。实施Serializable 的决定应该非常谨慎,并且应该仔细设计序列化的形式(Efffective Java,第 2 版)。
【解决方案2】:

如果您不想(或不能)实现 Serializable 接口,可以使用 XStream。这是一个简短的tutorial。

在你的情况下:

XStream xstream = new XStream();
Generic<T> generic = ...;//whatever needed
String xml = xstream.toXML(generic);
//write it to a file (or use xstream directly to write it to a file)

【讨论】:

  • 实现Serializable 的另一种替代方法是实现Externalizable(它本身扩展了Serializable)。
猜你喜欢
  • 2016-09-02
  • 2010-12-17
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多