标签: externalizable


当我们可以在java中覆盖writeObject和readObject时,为什么我们有Externalizable

由于我们可以通过覆盖writeObject()和readObject()来覆盖默认的序列化过程,那么Externalizable接口的需求是什么?

java serialization externalizable

15
推荐指数
1
解决办法
1223
查看次数

Externalizable 与 Serializable 有何不同?

我读到了

Externalizable 为我们提供了 writeExternal() 和 readExternal() 方法,这使我们可以灵活地控制 Java 序列化机制,而不是依赖于 Java 的默认序列化。

但是,如果我实现了 Serializable 并覆盖,readObject(), writeObject(), 那么它是否也意味着我正在自定义序列化过程?

它有什么不同?

谢谢。

java serialization deserialization externalizable

5
推荐指数
1
解决办法
5228
查看次数

为什么Java抱怨"无有效的构造函数",即使存在默认构造函数?

public class ExternalizableClass implements Externalizable
{
  public static ExternalizableClass CACHE = new ExternalizableClass(-1);

  int id;

  public ExternalizableClass()
  {
    id = (int)(Math.random() * 1000);
  }

  public ExternalizableClass(int i)
  {
    id = i;
  }


  @Override
  public void writeExternal(ObjectOutput out) throws IOException
  {
    out.writeInt(id);
  }

  @Override
  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
  {
    //id = in.readInt();
    id = in.readInt();
  }


  public Object writeReplace() throws ObjectStreamException
  {
    return new Write(0);
  }

  private class Write extends ExternalizableClass
  {
    int value;

    public Write()
    {
    } …
Run Code Online (Sandbox Code Playgroud)

java serialization constructor deserialization externalizable

3
推荐指数
1
解决办法
1509
查看次数

Java 外化与瞬态

我在考虑外部化的目的,因为您可以简单地将属性标记为transient并防止其序列化。但是,经过进一步研究,我发现transient如果您需要决定在运行时需要什么,这种方法(即标记为)可能并不理想。从理论上讲,这对我来说是有意义的。但是,实际上我看不出外部化如何对运行时更友好。我的意思是,您仍然必须决定在类的定义中writeExternal()readExternal()定义期间需要什么或不需要什么。那么,如何在运行时更友好?

强调这一点的文件如下,

如果一切都是通过实现 Serializable 接口自动处理的,为什么有人喜欢实现 Externalizable 接口并费心定义这两个方法?只需对过程进行完全控制。好的...让我们举一个例子来理解这一点。假设我们有一个具有数百个字段(非瞬态)的对象,并且我们只希望将几个字段存储在持久存储中而不是全部。一种解决方案是将所有其他字段(除了我们要序列化的字段)声明为瞬态,默认的序列化过程将自动处理。但是,如果这几个字段在设计时不是固定的,而是在运行时有条件地决定呢?在这种情况下,实现 Externalizable 接口可能是更好的解决方案。

java transient externalizable

3
推荐指数
2
解决办法
3285
查看次数