如何建立网站赚钱,开发一款网络游戏需要多少钱,提高企业网站的访问率,游戏网站开发设计报告硬盘序列号示例有些书极大地改变了你的生活。 其中一本书是Joshua Bloch撰写的“ Effective Java” 。 在下面您可能会发现一些小的实验#xff0c;该实验的灵感来自于本书的第11章“串行化”。 假设我们有一个为继承而设计的类#xff0c;它本身不是可序列化的 #xff0c… 硬盘序列号示例 有些书极大地改变了你的生活。 其中一本书是Joshua Bloch撰写的“ Effective Java” 。 在下面您可能会发现一些小的实验该实验的灵感来自于本书的第11章“串行化”。 假设我们有一个为继承而设计的类它本身不是可序列化的 并且没有无参数的构造函数如以下示例所示 public class CumbersomePoint {private String name;private double x;private double y;protected CumbersomePoint(double x, double y, String name) {this.x x;this.y y;this.name name;}public String getName() {return name;}public double getX() {return x;}public double getY() {return y;}...
} 现在当我们扩展此类时例如通过以下方式 public class ConvenientPoint extends CumbersomePoint implements Serializable {public ConvenientPoint(double x, double y, String name) {super(x, y, name);}...
} 并尝试序列化然后反序列化任何ConvenientPoint实例我们将很快遇到漂亮的InvalidClassException 抱怨没有有效的构造函数。 在您应用称为序列化代理模式的技术之前情况看起来有点绝望。 首先将内部类添加到ConvenientPoint类中 private static class SerializationProxy implements Serializable {private String name;private double x;private double y;public SerializationProxy(ConvenientPoint point) {this.name point.getName();this.x point.getX();this.y point.getY();}private Object readResolve() {return new ConvenientPoint(x, y, name);}} SerializationProxy类将表示封闭类实例的逻辑状态。 我们还必须在ConvenientPoint类中添加以下方法 private Object writeReplace() {return new SerializationProxy(this);} 现在当ConvenientPoint实例将被序列化时由于writeReplace方法它将提名其替换对象– 序列化 代理实例将被序列化而不是ConvenientPoint 。 另一方面当序列化代理将被反序列化时 readResolve方法的使用将提名其替代品即ConvenientPoint实例。 如您所见无论缺少不可序列化的父类的无参数构造函数我们都使ConvenientPoint可序列化。 在本文结尾处还有一句话–如果要防止破坏由构造函数强制执行的类不变式可以使用序列化代理模式 在我们的示例中为ConvenientPoint在类中添加以下方法 private void readObject(ObjectInputStream stream) throws InvalidObjectException {throw new InvalidObjectException(Use Serialization Proxy instead.);} 这将防止对封装类进行反序列化。 翻译自: https://www.javacodegeeks.com/2014/06/serialization-proxy-pattern-example.html硬盘序列号示例