至于其他指出,您可以使用Serialization解决您的问题。你应该让你的Mat
类实现Serializable
接口。
下,而不是手动将对象转换为字节,你可以直接写你的对象,通过在ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject(mat);
包裹你流在receival你可以以同样的方式提取对象。
ObjectInputStream ois = new ObjectInputStream(inputStream);
Mat mat = (Mat)(ois.readObject());
而不是使用byte
的沟通中,您可以通过更灵活的基于XML的通信替换上面。您可以让java为您使用JAXB(Java Architecture for Xml Binding)为您创建XML,这非常容易,而且与序列化非常相似。
// for sender
JAXBContext jc = JAXBContext.newInstance(Mat.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(mat, outputStream);
// for receiver
JAXBContext jc = JAXBContext.newInstance(Mat.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Mat mat = unmarshaller.unmarshal(inputStream);
在你的情况你的对象有本地引用。但是对于这个问题有一个简单的解决方案。只需通过创建一个包装类
import java.io.Serializable;
public class MatWrapper implements Serializable {
int rows;
int cols;
int type;
byte[] data;
public MatWrapper() {
}
public MatWrapper(Mat mat)
{
if (mat.isContinuous()) {
int elemSize = (int) mat.elemSize();
rows = mat.rows();
cols = mat.cols();
type = mat.type();
data = new byte[cols * rows * elemSize];
mat.get(0, 0, data);
}
}
public Mat toMat()
{
Mat mat = new Mat(rows, cols, type);
mat.put(0, 0, data);
return mat;
}
}
用法打破本土界限:
// convert Mat object to a wrapper object
MatWrapper wrapper = new MatWrapper(mat);
// this wrapper object is serializable
// next on receiver-side
MatWrapper wrapper = (MatWrapper)(ois.readObject);
Mat mat = wrapper.toMat();
@Newd ..是的,我现在提到它 –
你试过ObjectOutputStream吗?这对你来说是一个很好的起点,因为它会自动处理序列化/反序列化。 – Danstahr
Nah ...我没有任何关于序列化/反序列化的想法 –