Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化:从一个类转换到另一个类_Java_Design Patterns_Serialization - Fatal编程技术网

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

Java 序列化:从一个类转换到另一个类,java,design-patterns,serialization,Java,Design Patterns,Serialization,我有两门课:FormatA和FormatB。它们以两种不同的格式保存相同的数据,便于处理 现在,在我的应用程序中,我想从FormatA创建FormatB 我认为应该有一个序列化程序,它从FormatA序列化到FormatB并反序列化。现在,根据序列化的定义,我的思维过程听起来并不正确 序列化是将对象的状态(包括其引用)转换为字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。简单……将对象转换为字节,并将字节转换回对象 在这种情况下,实现目标的正确方法是什么?我几乎没有其他的可能性

我有两门课:FormatA和FormatB。它们以两种不同的格式保存相同的数据,便于处理

现在,在我的应用程序中,我想从FormatA创建FormatB

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

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

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

  • 让FormatA和FormatB类具有转换为另一种格式的方法

  • 让实用程序使用
    transformToFormatA(formatB)
    transformToFormatB(formatA)
    等方法进行转换


  • 不确定哪种方法是正确的?

    我想你要找的是一种
    toObject
    方法,在你的例子中
    toClassA
    class B
    toClassB
    class a
    中,你可以在这些方法中实现你想要的任何逻辑。
    这类似于java中的
    toString
    函数,如果你想一想,String是一个对象,我们基本上是将object/“更改格式”的对象转换为String

    我想你要找的是一个
    toObject
    方法,在您的情况下,
    toClassA
    class B
    toClassB
    class A
    中,您可以在这些方法中实现您想要的任何逻辑。
    这类似于java中的
    toString
    函数,如果您仔细想想,String是一个对象,我们基本上是将object/“更改格式”对象转换为String

    您可以尝试使用作为一种可能性,或使用Java工具,如。

    您可以尝试使用作为一种可能性,或使用Java工具,如。

    如您所理解的,序列化不是用另一个类的对象创建一个类的对象的过程。 您正在寻找转换。因为您没有提到这些类的内容,所以假设FormatA有一个String属性,而FormatB有一个整数。 转换逻辑是将整数转换为字符串,反之亦然。 为此,您可以使用以下方法之一: 1.非类(可能是静态)方法,每个转换方向一个。 2.类方法,例如toA、toB
    3.一种复制构造函数-FormatA(FormatB b)-反之亦然。

    正如您所理解的,序列化不是从另一个类的对象创建一个类的对象的过程。 您正在寻找转换。因为您没有提到这些类的内容,所以假设FormatA有一个String属性,而FormatB有一个整数。 转换逻辑是将整数转换为字符串,反之亦然。 为此,您可以使用以下方法之一: 1.非类(可能是静态)方法,每个转换方向一个。 2.类方法,例如toA、toB
    3.一种复制构造函数-FormatA(FormatB b)-反之亦然。

    如您所述,FormatA和FormatB包含相同的数据。因此,在应用程序中,相同的数据以两种不同的格式使用。为此目的使用序列化可能是一种攻击

    相反,您可以将数据保存在一个位置,并根据需要使用asXXFormat方法以所需格式显示。e、 g.P(x,y)点可以在笛卡尔坐标系和极坐标系中使用。类点可以显示为两个视图,即笛卡尔视图和极坐标视图

    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);
                }
            };
        }
    }
    

    正如您所提到的,FormatA和FormatB包含相同的数据。因此,在应用程序中,相同的数据以两种不同的格式使用。为此目的使用序列化可能是一种攻击

    相反,您可以将数据保存在一个位置,并根据需要使用asXXFormat方法以所需格式显示。e、 g.P(x,y)点可以在笛卡尔坐标系和极坐标系中使用。类点可以显示为两个视图,即笛卡尔视图和极坐标视图

    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);
                }
            };
        }
    }
    

    问题的第一部分和第二部分是不相关的。序列化可能是转换算法的一部分,但可能不是。至于第二部分,您可以通过任何一种方式来完成—使用实用程序方法或在类中完成。你打算有两种以上的格式吗?是的…将来它可以有更多的格式。我认为将其移出实际的格式类是有意义的。就像在一些实用程序中抽象转换逻辑或使用转换器一样。然后,您确实可以使用实用程序方法或,具体取决于您如何表示数据。如果你能给我们更多关于格式的信息,那就更容易说了。你的问题的第一部分和第二部分是不相关的。序列化可能是转换算法的一部分,但可能不是。至于第二部分,您可以通过任何一种方式来完成—使用实用程序方法或在类中完成。你打算有两种以上的格式吗?是的…将来它可以有更多的格式。我认为将其移出实际的格式类是有意义的。就像在一些实用程序中抽象转换逻辑或使用转换器一样。然后,您确实可以使用实用程序方法或,具体取决于您如何表示数据。如果你给我们提供更多关于格式的信息,这将更容易告诉我们。新手告诉我们修复损坏的设计,并摆脱基于相同信息的两个类。杰出的新手告诉我们修复损坏的设计,并摆脱基于相同信息的两个类。杰出的我试图在课堂上避免转换逻辑。与其在单独的实用程序中抽象transformXYZ(),或者使用@BlizzardmanI提到的Transformer设计模式(),不如尝试避免转换