2010-08-20 95 views
2

我有一张城市地图,包含我需要(去)序列化的街道。每个街道由城市和ID识别,就像这样:对同一对象使用两种不同的序列化方法

private final City city; 
private final long id; 

城市包含所有的街道名单在这个城市(City.streetList),以便保存模型时我可以做这样的事情

serializeToFile(modelFile, currentCity); 

这工作并没有问题,但现在我想通过网络发送街道(也使用序列化)。当我序列化街道时,很显然城市对象也会被序列化,以至于所有街道都会被序列化,从而导致非常大的数据包大小。

我不能让city暂时,因为它是唯一需要识别街道。我也不能使City.streetList为瞬态,因为我需要我的模型列表。

每个城市都有一个唯一的ID,所以这样的事情应该是可能的

private void writeObject(ObjectOutputStream out) throws IOException { 
    if (serializeForNetwork) { // How can I know this here? 
     out.writeObject(city.getId()); 
    } else { 
     out.writeObject(city); 
    } 
    out.write(id); 
} 

如前所述,我不知道该对象应该怎么知道它被写入到网络(调用street.setWritingToNetwork(true)序列化似乎更前比丑陋),也许这不是一个好办法吗?

任何想法非常感谢! :-)

回答

2

如果没有办法让你知道该对象被序列化为文件或通过网络,你应该总是编写城市编号而不是整个城市。有一个方法可以让城市在给定ID的情况下查找。

另一种使用方法是序列化代理。在此pdf中查看详细信息:Effective Java Reloaded。基本上,序列化代理与被对象的逻辑状态序列化的对象完全不同。该对象会覆盖writeReplace和readResolve方法,以写入代理而不是此对象,并通过读取代理来创建对象。代理也只会写城市编号,而不是整个城市。

2

出路可能是重新设计您的应用程序,以便您的街道对象不再包含对城市的引用,而只是一个“城市ID”。全市对象可以去到一个单独的散列映射:

private final long cityId; 
private final long id; 

和地方转换器:

public static City getCity(long id) { 
    return cityMap.get(id); 
} 

序列化街道目标将变得非常小,你就必须序列化和存储或发送citymap一旦。

相关问题