我对书中发现的所有意见感到很困惑,甚至在这里请耐心等待我!
Clay Richardson的专业Java JDK 6中说明了
你会注意到MyBean没有实现Serializable。 XMLEncoder / Decoder不需要序列化实现的类 序列化的。
那个
XMLEncoder / Decoder API序列化对象 实例,不了解其私有数据成员。它根据对象进行序列化 方法,它的JavaBean属性,通过JavaBeans约定公开> getter和setter(getXXX和setXXX)。
这是否意味着XMLEncoder可以序列化不可序列化的对象,如javafx.scence.color
,如果它是JavaBean中的字段?好吧,我尝试创建一个JavaBean并遵循所有关于命名的约定和默认的no-arg构造函数,如下所示
import javafx.geometry.Point2D;
import javafx.scene.paint.Color;
import java.io.Serializable;
import java.util.Map;
public class PCircle extends Shape implements Serializable {
private Point2D position;
private Map<String, Double> properties;
private Color backColor;
private Color strokeColor;
public void setPosition(Point2D position) { this.position = position; }
public Point2D getPosition() { return this.position; }
public void setProperties(Map<String, Double> properties) { this.properties = properties; }
public Map<String, Double> getProperties() { return this.properties; }
public void setBackColor(Color color) { this.backColor = color; }
public Color getBackColor() { return this.backColor; }
public void setStrokeColor(Color color) { this.strokeColor = color; }
public Color getStrokeColor() { return this.strokeColor; }
}
其中Shape
是实现IShape
接口的抽象类,如下所示
import javafx.geometry.Point2D;
import javafx.scene.paint.Color;
import java.util.Map;
public interface IShape {
void setPosition(Point2D position);
Point2D getPosition();
void setProperties(Map<String, Double> properties);
Map<String, Double> getProperties();
void setBackColor(Color color);
Color getBackColor();
void setStrokeColor(Color color);
Color getStrokeColor();
}
public abstract class Shape implements IShape {
abstract public void setPosition(Point2D position);
abstract public Point2D getPosition();
abstract public void setProperties(Map<String, Double> properties);
abstract public Map<String, Double> getProperties();
abstract public void setBackColor(Color color);
abstract public Color getBackColor();
abstract public void setStrokeColor(Color color);
abstract public Color getStrokeColor();
}
现在如果我运行这个主要方法来测试
import javafx.geometry.Point2D;
import javafx.scene.paint.Color;
import java.beans.XMLEncoder;
import java.io.FileOutputStream;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Double> properties = new HashMap<>();
properties.put("First Property", 20.5);
PCircle circle = new PCircle();
circle.setPosition(new Point2D(20, 30));
circle.setProperties(properties);
circle.setBackColor(Color.BLACK);
circle.setStrokeColor(Color.RED);
try {
FileOutputStream fos = new FileOutputStream("output.xml");
XMLEncoder encoder = new XMLEncoder(fos);
encoder.writeObject(circle);
encoder.close();
fos.close();
} catch (Exception ex) {
System.out.println("Exception! " + ex.getMessage());
}
}
}
我收到此错误
java.lang.InstantiationException: javafx.scene.paint.Color
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...
java.lang.InstantiationException: javafx.scene.paint.Color
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...
java.lang.InstantiationException: javafx.scene.paint.Color
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...
java.lang.InstantiationException: javafx.scene.paint.Color
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...
有趣的是,如果我使用可序列化的类,例如java.awt.Color
,代码就可以正常运行并生成XML。但即使清楚地说明JavaBean不需要实现Serializable
接口,这又如何重要呢?
答案 0 :(得分:3)
这是否意味着
class Component extends React.Component { static getDerivedStateFromProps(props, current_state) { if (current_state.value !== props.value) { return { value: props.value, computed_prop: heavy_computation(props.value) } } return null } }
可以序列化不可序列化的对象,例如XMLEncoder
,如果它是JavaBean中的字段?
没有。这意味着它可以序列化不可序列化的对象,例如javafx.scene.[paint.]color
,如果它们也遵守JavaBeans约定,并且它们的对象值属性也是如此,依此类推,直到关闭。 / p>
在这种情况下,javafx.scene.paint.color
没有no-args构造函数。 javafx.scene.paint.color
工作的事实是由于它遵守了JavaBeans约定,而不是它java.awt.Color
。