至於其他指出,您可以使用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 ...我沒有任何關於序列化/反序列化的想法 –