从 Python 反序列化 Java 中的对象

Deserialize objects in Java from Python

我想通过 Python(客户端)和 Java(服务器)的套接字将对象从 Python 发送到 Java,但是我做不到我只看到这个:

invalid stream header: 8003635F

我尝试使用 Python-Python 和 Java-Java,我没有遇到任何不便。我想知道我的代码是否有误,或者我忘记了什么。我会注意任何回应。 附代码:

Java代码

public static void main(String[] args) {
        int port = 10002;
        try {
            ServerSocket server = new ServerSocket(port);
            System.out.println("Waiting for clients...");
            Socket client = server.accept();
            System.out.println("Connect: " + client.getInetAddress());
            Vehicle car;
            ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
            car = (Vehicle) ois.readObject();
            System.out.println("Brand: " + car.getBrand() + "Model: " + coche.getModel());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
class Vehicle implements Serializable {

    private String brand;
    private String model;

    public Vehicle(String brand, String model) {
        this.brand = brand;
        this.model = model;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Vehicle{" + "brand=" + brand + ", model=" + model + '}';
    }
}

Python代码

class Vehicle():
    def __init__(self,brand,model):
        self.brand = brand
        self.model = model
        
    def show(self):
        print("Brand: ",self.brand,"\nModel: ",self.model)

car = Vehicle("Mazda","3") 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serverAddress = ("172.16.4.18",10002) 
sock.connect(serverAddress)
sock.send(pickle.dumps(car)) 
sock.close()

java 和 python 对象之间不兼容。您必须使用两种语言都能理解的内容。我会将 java 中的对象作为 JSON 字符串发送,并在 python 中将其作为 JSON 摄取,然后将其转换回 python 对象。要将 java 对象转换为 JSON,我发现 this

补充一下 Mauricio 的回答,从内存中表示到字节的转换称为 encoding/serialization/marshaling。这种编码通常与特定的编程语言相关联,用另一种语言读取数据非常困难。

如果您以编码方式传输数据,那么您可能会在很长一段时间内使用当前的编程语言,这是一个非常糟糕的主意。

因此,当我们想要将数据写入文件或通过网络发送数据时,我们应该将其编码为某种与语言无关的自包含字节序列。流行的选项是 JsonXML

其他流行的二进制编码选项是 BsonBISONMessagepack