序列化:从一个类转换到另一个类

时间:2017-08-02 20:16:28

标签: java design-patterns serialization

我有2个课程格式A& FormatB。它们以2种不同的格式保存相同的数据,以便于处理。

现在在我的应用程序的某个时刻,我想从FormatA创建FormatB。

我认为应该有Seri​​alizer从FormatA序列化到FormatB并反序列化。现在,根据序列化的定义,我的思维过程听起来不正确。

  

序列化是将对象的状态(包括其引用)转换为字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。简单......将对象转换为字节和字节回到对象。

在这种情况下,实现目标的正确方法是什么?我还有其他一些可能性:

  1. 让课程格式A& FormatB具有转换为另一种格式的方法。

  2. 使用transformToFormatA(formatB)transformToFormatB(formatA)等方法进行转换。

  3. 不确定哪一种是正确的做法?

4 个答案:

答案 0 :(得分:2)

如前所述,FormatA和FormatB包含相同的数据。所以看起来 - 在应用程序中,相同的数据以两种不同的格式使用。为此目的使用序列化可能是一个黑客;

相反,您可以将数据保存在一个位置,并根据需要使用asXXFormat方法以所需格式显示。例如P(x,y)点可用于笛卡尔坐标和极坐标。 Class Point可以将自己暴露为两个视图,即笛卡儿和极地。

public interface Cartesian {
    double getX();
    double getY();
}
public interface Polar {
    double getMagnitude();
    double getAngle();
}
public class Point{
    private double x;
    private double y;
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public Cartesian asCartesian(){
        return new Cartesian(){

            @Override
            public double getX() {
                return x;
            }

            @Override
            public double getY() {
                return x;
            }
        };
    }

    public Polar asPolar(){
        return new Polar(){

            @Override
            public double getMagnitude() {
                return Math.sqrt(x*x + y*y);
            }

            @Override
            public double getAngle() {
                return Math.atan2(y, x);
            }
        };
    }
}

答案 1 :(得分:1)

您可以尝试使用Transformer Design Pattern或使用Dozer等Java工具。

答案 2 :(得分:0)

我认为您正在寻找的是toObject方法,在toClassAclass BtoClassBclass A,您可以执行任何操作你想要的那些方法的逻辑。 这类似于java中的toString函数,如果你考虑一下,String是一个对象,我们基本上是转换对象/'改变格式'字符串的对象

答案 3 :(得分:0)

正如您已经了解的那样,序列化不是从另一个类的对象创建一个类的对象的过程。 您正在寻找转换。由于您没有提及这些类的内容,我们假设FormatA具有String属性,而FormatB拥有Integer。 转换逻辑将把Integer转换为String,反之亦然。 为此,您可以使用以下方法之一: 1.非类(可能是静态的)方法,每个转换方向一个。 2.类方法,例如toA,toB 3.一种复制构造函数 - FormatA(FormatB b) - 反之亦然。