Java的XMLEncoder可以序列化具有不可序列化字段的对象吗?

时间:2018-04-17 00:55:49

标签: java xml serialization

我对书中发现的所有意见感到很困惑,甚至在这里请耐心等待我!

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接口,这又如何重要呢?

1 个答案:

答案 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