2009-10-22 10 views
5
public Configuration(Node node, File file) { 
    HashMap<String, String> conf = (HashMap<String, String>) SerializationUtils.deserialize(new FileInputStream(file)); 
} 

Bunun güvenli olmayan bir döküm uyarı verir nedenanlama Bir Koleksiyon deserializing zaman, ama güvenli bir şekilde bunu yapmanın en iyi/kabul edilen yolu nedir? Iyi bir yolu var mı?Güvensiz jenerik dökme

cevap

2

Bu durumu yalnızca Java dilini kullanarak tamamen güvenli bir şekilde kullanamazsınız.

bu art arda yapılması gereken bir şeydir ve gerçekten, ben ve jenerik nesneleri okumak ve döküm için bir genreic yöntemini kullanmanızı öneriyoruz toparlayamıyorum Çünkü:

@SuppressWarnings("unchecked") 
public static <T> T readObject(
    ObjectInputStream in 
) throws IOException, ClassNotFoundException { 
    return (T)in.readObject(); 
} 

Ancak, ben önermek Geçerli uyarıları bastırmak için genellikle böyle yöntemler kullanmazsınız.

+0

Bu yüzden korktum; sadece bir şey eksik olduğunu umuyordum:/ –

+0

Sadece bir kırık dil özelliği tasarımı bağlamında geçerli bir uyarı! –

+1

Tür silme için değilse, bu nesneleri yok edemeyiz. Bence bu bir galibiyet. –

2

gerçekten denetlemek istediğiniz bu düzgün çünkü derleme zamanı tür bilgileri yapmanın bir yolu bile yok (yani String) zamanında mevcut değildir, süreç boyunca (dökme aslında oluştuğunda yani zaman) silinmeye olarak bilinen .

Map<?,?> conf = deserialize(rsrc); 
Map<String, String> checked = checkMap(conf, String.class, String.class); 
//can use checked freely 

:

@SuppressWarnings("unchecked") 
public static <K, V> Map<K,V> checkMap(Map<?,?> map, Class<? extends K> k, Class<? extends V> v) { 
    for (Map.Entry<?, ?> e : map) { 
     k.cast(e.getKey()); //will throw ClassCastException 
     v.cast(e.getValue()); 
    } 
    return (Map<K,V>) map; //unchecked 
} 
+0

Tam olarak geçerli ve doğru bir cevabın neden reddedildiğini açıklığa kavuşturmak isteyen var mı? Bu, çünkü * I * herhangi bir şans ile geçersiz ve yanlış bir cevap düşürdü? –

+0

Downvoter değildim, ancak bunun çok aşamalı erişim söz konusu olduğunda işe yaramayacağını görebiliyorum. Bir iş parçacığı, denetleyiciyi çalıştırır, diğeri ise, denetimden sonra "yanlış" türünü eklemek için özgün başvuruyu kullanır. Boom, ClassCastException. –

+0

@Steven - Bence "çok parçalı bir ortamda güvensiz olabilir" * mutlaka bu "check" yaklaşımında bir hata. Cevabım için biraz daha ayrıntı ekledim. Yöntem, bu şekilde çalışmak için tasarlanmamıştır ve bu nedenle, denge için –

1

önceki cevap üzerine inşa etmek için, genellikle biraz daha gitmek Ben en iyi yolu bazı ısmarlama "denetleyici" thru Serileştirilmemiş koleksiyonu geçmek için olduğunu düşünüyorum uyarıları bastırırken. Bastırma kapsamını azaltmak için ek açıklamaları yöntem yerine yerel bir değişkene koydum. Bu demektir ki, eğer birisi daha sonra bir iyileştirme yöntemiyle gelirse, istemeden bir bastırma olmayacaktır. Başka bir kod satırı ekliyor, ama bence ticarete değer.

public static <T> T readObject(
    ObjectInputStream in 
) throws IOException, ClassNotFoundException { 
    @SuppressWarnings("unchecked") 
    T val = (T)in.readObject(); 
    return val; 
} 

Ne yazık ki bir ifadeye (en azından henüz) açıklama ekle olamaz.

+0

Yöntemin tüm noktası bir uyarıyı bastırmak olduğundan, ek açıklamayı yönteme koyma eğilimindeyim. –