Java 从字节数组创建对象(带构造函数)

Java 从字节数组创建对象(带构造函数),java,arrays,object,constructor,bytearray,Java,Arrays,Object,Constructor,Bytearray,在我的项目中,我有一个类,它经常需要序列化为字节数组。 我目前在我的类中有一个构造函数,它接受数组,解析它并创建一个新对象。完成后,构造函数从该(新)对象读取所需字段,并在类中设置适当的值 public class MyClass implements Serializable { private int fieldOne; private boolean fieldTwo; ... // This is default constructor public MyClass

在我的项目中,我有一个类,它经常需要序列化为字节数组。 我目前在我的类中有一个构造函数,它接受数组,解析它并创建一个新对象。完成后,构造函数从该(新)对象读取所需字段,并在类中设置适当的值

public class MyClass implements Serializable {
  private int fieldOne;
  private boolean fieldTwo;
  ...

  // This is default constructor
  public MyClass(){
  }

  // This is the constructor we are interested in
  public MyClass(byte[] input){
    MyClass newClass = null;

    try(ByteArrayInputStream bis = new ByteArrayInputStream(input);
         ObjectInput in = new ObjectInputStream(bis)) {
          newClass = (MyClass) in.readObject();
      } catch (ClassNotFoundException | IOException e) {
          e.printStackTrace();
      }
    if (newClass != null) {
      this.fieldOne = newClass.getFieldOne;
      this.fieldTwo = newClass.getFieldTwo;
      ...
    }
  }

  public int getFieldOne(){
    return fieldOne;
  }
  public boolean getFieldTwo(){
    return fieldTwo;
  }
  ...
}

这样的代码工作正常,但问题是:是否可以(使用该构造函数)直接创建MyClass对象,而无需创建“newClass”实例并手动设置所有值

您不应该像那样反序列化对象,而应该实现
readObject
,如下所示:

private void readObject(ObjectInputStream in)
    throws IOException, ClassNotFoundException {

    in.defaultReadObject();

    // custom
    this.fieldOne = in.readXXX();
    this.fieldTwo = in.readXXX();
}
这是专门针对自定义序列化的,为什么不直接使用api,或者创建一个静态方法来检索对象:

public static MyClass readFromByteArray(byte[] input) {
    Myclass obj = null;

    try (ByteArrayInputStream bis = new ByteArrayInputStream(input);
        ObjectInputStream ois = new ObjectInputStream(bis)) {
        obj = (MyClass) in.readObject();
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    } 

    return obj;   
}

不,这是不可能的

但是,您可以引入静态工厂方法,而不是构造函数
MyClass(byte[])
,后者随后创建两个
MyClass
对象:

public static MyClass create(byte[] input) {
    try(ObjectInput in = new ObjectInputStream(new ByteArrayInputStream(input))) {
        return (MyClass)in.readObject();
    }
    catch (Exception e) {
        throw new IllegalStateException("could not create object", e);
    }
}

为什么你需要它成为一个构造器?您可以将其设置为静态方法,然后简单地返回
newClass