簡體   English   中英

讀/寫Arraylist <java.awt.geom.Area> 通過插座

[英]Read/Write Arraylist<java.awt.geom.Area> through socket

如何通過套接字發送Arraylist<java.awt.geom.Area> 因為Area不可Serializable所以它給出了NotSerializableException是否有任何發送方法?

為了通過網絡連接發送不可序列化的類,您必須提供代碼以自己對其進行“序列化”。 這意味着設置序列化編碼/格式,即將其轉換為String或二進制表示形式,編寫代碼以產生該格式,還編寫可解析String / binary表示形式並重新創建對象實例的代碼。

這意味着您必須具有足夠的內部狀態(並在您的String /二進制表示中進行編碼),才能在反序列化時重新創建等效對象。 由於java.awt.geom.Area本身不支持序列化,因此一切都取決於您。

對於一個簡單的類,調用toString()進行序列化並編寫一些簡單的代碼來解析該輸出字符串以重建等效對象可能就足夠了。 對於復雜的類,如何執行此操作將取決於類的內部,並且可能超出SO所能解釋的范圍。

對於Area這可能並非易事,因為它可以表示很多不同的Shape類。

Path2D.Float和Path2D.Double是可序列化的,因此您可以發送其中之一。

發送方:

void writeAreas(List<Area> areas, ObjectOutputStream stream)
throws IOException {
    List<Path2D> paths = new ArrayList<>(areas.size());
    for (Area area : areas) {
        paths.add(new Path2D.Float(area));
    }
    stream.writeObject(paths);
}

接收方:

List<Area> readAreas(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
    List<?> paths = (List<?>) stream.readObject();
    List<Area> areas = new ArrayList<>(paths.size());
    for (Object pathObj : paths) {
        Shape path = (Shape) pathObj;
        areas.add(new Area(path));
    }
    return areas;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM