从 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。这种编码通常与特定的编程语言相关联,用另一种语言读取数据非常困难。
如果您以编码方式传输数据,那么您可能会在很长一段时间内使用当前的编程语言,这是一个非常糟糕的主意。
因此,当我们想要将数据写入文件或通过网络发送数据时,我们应该将其编码为某种与语言无关的自包含字节序列。流行的选项是 Json
和 XML
其他流行的二进制编码选项是 Bson
、BISON
、Messagepack
我想通过 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。这种编码通常与特定的编程语言相关联,用另一种语言读取数据非常困难。
如果您以编码方式传输数据,那么您可能会在很长一段时间内使用当前的编程语言,这是一个非常糟糕的主意。
因此,当我们想要将数据写入文件或通过网络发送数据时,我们应该将其编码为某种与语言无关的自包含字节序列。流行的选项是 Json
和 XML
其他流行的二进制编码选项是 Bson
、BISON
、Messagepack