当前位置: 首页 > 知识库问答 >
问题:

在Java中序列化和反序列化接口

花和宜
2023-03-14

我有两个Java应用程序-MasterSlaveMaster需要通过套接字发送到类DEParamSet的Slave实例。

    public class DEParamSet implements Serializable {

        private static final long serialVersionUID = 8151790178483218232L;
        public final float CR, F;
        public final int NP, D;
        public final Specimen specimen;
        public final IOptimizationFunction optFunction;

        // Constructor and some methods....
        ... some code ...
    }
    public interface IOptimizationFunction extends Serializable {
        public double evaluate(Object[] values);
    }

Master创建这个类的实例,序列化它并通过套接字发送到Slave。

    // Create objective function
    IOptimizationFunction opt = new IOptimizationFunction() {

        private static final long serialVersionUID = -5167105656008707046L;

        @Override
        public double evaluate(Object[] params) {
            return (double) params[0] * (double) params[1];
        }
    };
    // Create instance of DEParamSet with objective function defined above.
    ...some code to create it...
    // Start thread, which serializes the instance and sends it via socket.
    ...some code...

Master上,一切正常。没有异常。Slave接收数据并尝试对其进行反序列化。引发以下异常

JAVAlang.ClassNotFoundException

DEParamSet类中没有错误,因为如果我用优化函数=null创建它,那么Slave就会毫无问题地反序列化它。我试图将实例序列化到Master中的文件中,然后也反序列化它。它工作正常。但是Slave无法反序列化实例,如果它保持优化函数的实现。当然,从包含IOptimization函数接口的定义

请帮忙。

编辑我有classTestingFunction。这门课看起来像这样:

    public abstract class TestingFunctions {
        public static double schwefel(Object[] params) {

            double res = 0d;
            for (int i = 0; i < params.length; i++) {
                res += (-1) * (double) params[i] * Math.sin(Math.sqrt(Math.abs((double) params[i])));
            }
            return res;
        }

        public static double rastrigin(Object[] params) {
            double res = 0d;
            for (int i = 0; i < params.length; i++) {
                res += Math.pow((double) params[i], 2) - 10 * Math.cos(2 * Math.PI * (Double) params[i]);
            }
            return res * 2 * params.length;
        }
    }

这些函数中的每一个都返回了类型double,参数是array of object。这相当于IOptimizationFunction接口中的方法双重求值(Object[]params)。因此,我的设想是,主创建DEParamSet对象,它将包含一些参数和接口IOptimizationFunction的具体实现。例如,一种可能的实现方式是:

    IOptimizationFunction opt = new IOptimizationFunction() {

        private static final long serialVersionUID = -5167105656008707046L;

        @Override
        public double evaluate(Object[] params) {
            return TestingFunctions.rastrigin(params);
        }
    };

在这种情况下,将调用Rastrigin的函数。但将调用哪个函数,这将在运行时定义用户。他可以从TestingFunction类中的函数中进行选择。

共有1个答案

虞展
2023-03-14
IOptimizationFunction opt = new IOptimizationFunction() {

    private static final long serialVersionUID = -5167105656008707046L;

    @Override
    public double evaluate(Object[] params) {
        return (double) params[0] * (double) params[1];
    }
};

上面的几行创建了一个匿名内部类的实例。然后,这个实例被序列化并发送给从类。因为从类路径中没有这个匿名内部类,所以它不能反序列化它。

确保将客户端和服务器共享的所有类放在一个公共项目中,并将该项目生成的jar文件放在两个应用程序(主应用程序和从应用程序)的类路径中。

 类似资料:
  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 问题内容: 我已经开始在我的第一个android应用程序上进行工作,并且具有处理多层图像的应用程序。我能够将项目文件的平面版本导出为PNG,但我希望能够保存分层图像以供以后编辑(包括应用于某些层的任何选项,例如基于文本的层)。 无论如何,我已经确保需要写入文件的类是“可序列化的”,但是由于android.graphics.Bitmap不可序列化这一事实而遇到了一些障碍。以下代码实质上将位图作为PN

  • 我有一个kdtree,其节点由以下字段组成:公共静态类节点实现可序列化{ 其中DataPoint定义: 公共静态类DataPoint实现可序列化{公共可比X;公共可比Y;公共可比Z; 我想序列化树,存储在文件中并在回答范围查询时反序列化。我对这个概念od序列化的理解并不好。从我收集的任何内容中,我编写了以下函数,但不起作用。有人能帮忙吗?

  • 问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加