2017-09-08 12 views
1

この質問は非常に単純ですが、私は答えがそうであるとは思わないので、達成したいことをインターネット上で何も見つけられていません。 GenericModelとGenericBeanの2つのクラスがあります。 Thosクラスにはマップが含まれています。コードは以下の通りです:どのようにオブジェクトをJavaでSerializableに変換するのですか

public class GenericBean implements IsSerializable { 
    Map<String, Serializable> properties = new HashMap<String, Serializable>(); 

    public Object getProperty(String key){ 

     return properties.get(key); 
    } 

    public void setProperty(String key, Serializable value){ 
     properties.put(key, value); 
    } 

    public Map<String, Serializable> getProperties() { 
     return properties; 
    } 

    public void setProperties(Map<String, Serializable> properties) { 
     this.properties = properties; 
    } 
} 

秒:

public class GenericModel { 
private final Logger log = LoggerFactory.getLogger(GenericModel.class); 

public Map<String, Object> getProperties() { 
    return properties; 
} 

public Object getProperty(String key) { 
    return properties.get(key); 
} 

public void setProperty(String key, Object value) { 
    properties.put(key, value); 
} 

public void setProperties(Map<String, Object> properties) { 
    this.properties = properties; 
} 

private Map<String, Object> properties = new HashMap<String, Object>(); 

}

私が達成したいどのような一般的な豆のマップのプロパティでGenericModelのマップのプロパティをコピーすることです。

コンパイルエラーが発生します。Map<String,Object>Map<String,Serializable>と互換性がありません。どうすればよいですか?

+2

使用鋳造を、そしてすべての値が実際に直列化可能であることを祈る: すべての非直列化可能な特性は、この場合には無視されます。 https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –

+1

'Map properties'を使用するのは解決策ですか? 'setProperty'メソッドを使うときにキャストしてキャストする – azro

+2

オブジェクトマップにシリアライズ可能ではないアイテムが含まれていると、どうなると思いますか?マップはお互いに互換性がないため、瞬間的な解決策はありません。あなたはいつも、これらの辺のケースをどうするかを決める必要があります(ドロップする、例外を投げる、...)。 – basst314

答えて

2

次のことが可能です。

  • 値はSerializableをinstanceofある各キー/値の「ソースマップ」
  • を繰り返す - あなたは
  • をマッピングする「シンク」にそのキー/値ペアを追加少なくとも理論的には、そのインタフェースを実装していない値について何をすべきか考える必要があります。
1

キャスティングを使用する場合は、次のように記述します。これのためにStream

Map<String, Object> properties = new HashMap<>(); 
properties.put("ser", "String"); 
properties.put("non ser", new Object()); 

Map<String, Serializable> serializableMap = properties.entrySet().stream() 
     .filter(entry -> entry.getValue() instanceof Serializable) 
     .collect(Collectors.toMap(Map.Entry::getKey, e -> (Serializable) e.getValue())); 

System.out.println(serializableMap); //{ser=String} 
関連する問題