在我的项目中,我有一个经常需要序列化为字节数组的类。 我目前在我的类中有一个构造函数,它接受数组,解析它并创建一个新对象。完成后,构造函数从该(新)对象中读取所需的字段,并在类中设置适当的值。
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"实例并手动设置所有值?
答案 0 :(得分:1)
您不应该像这样反序列化您的对象,而应如specification所示实现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;
}
答案 1 :(得分:1)
不,这是不可能的。
但是,而不是构造函数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);
}
}