2011-02-01 6 views
2

私はRMIを使用してクラスのテレポートを持っています。しかし、私はそれらのスレッドセーフなオブジェクトは、シリアル化することができますか?"CopyOnWriteArrayList"と "ConcurrentHashMap"をシリアル化できますか?

更新 skaffmanははい、しかし私はシリアル化に失敗しました。

これは私がテレポートするクラスです。

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package net.shisoft.beans; 

import java.util.concurrent.ConcurrentHashMap; 
import java.util.concurrent.CopyOnWriteArrayList; 

/** 
* 
* @author Shisoft 
*/ 
public class WhatzNewList { 

    ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> WhatzNewTable = new ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>>(); 
    String user; 

    public ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> getWhatzNewTable() { 
     return WhatzNewTable; 
    } 

    public void setWhatzNewTable(ConcurrentHashMap<String, CopyOnWriteArrayList<WhatzNewEntry>> WhatzNewTable) { 
     this.WhatzNewTable = WhatzNewTable; 
    } 

    public String getUser() { 
     return user; 
    } 

    public void setUser(String usere) { 
     this.user = usere; 
    } 

    public WhatzNewList(String user) { 
     this.user = user; 
    } 
} 

これはWhatzNewEntry

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package net.shisoft.beans; 

import java.util.Date; 

/** 
* 
* @author Shisoft 
*/ 
public class WhatzNewEntry { 
    String Title; 
    String context; 
    String contact; 
    Date Time; 

    public Date getTime() { 
     return Time; 
    } 

    public void setTime(Date Time) { 
     this.Time = Time; 
    } 

    public String getTitle() { 
     return Title; 
    } 

    public void setTitle(String Title) { 
     this.Title = Title; 
    } 

    public String getContact() { 
     return contact; 
    } 

    public void setContact(String contact) { 
     this.contact = contact; 
    } 

    public String getContext() { 
     return context; 
    } 

    public void setContext(String context) { 
     this.context = context; 
    } 

} 

がskaffmanかもしれクラスが右である、しかし、ここで間違って何?

+0

あなたの 'WhatzNew *'クラス定義の両方に 'Serializable'を追加する必要があります。 – biziclop

答えて

5

どちらもjava.io.Serializableを実装しています。そう、はい、彼らはシリアル化することができます。

の内容のシリアル化が可能かどうかは、まったく異なる質問です。

+1

_contents_のニースキャッチ: – extraneon

+0

@extraneon:一度やりなさいなど – skaffman

+0

Eh、申し訳ありません。java.io.NotSerializableException:net.shisoft.beans.WhatzNewList – Shisoft

5

ConcurrentHashMaps(CHM)は、効率的にシリアル化されていない重いオブジェクトです。例えば。なぜあなたはすべてのロック情報をシリアル化したいのですか?

HashMap、Map、Set、toString()などの中間オブジェクトに変換する方がはるかに効率的です。

最も効率的なのはもちろん、デフォルトのシリアライズ可能な動作を使用せず、独自のExternalizableインターフェイスを作成して、バッファの内容を完全に制御できるようにすることです。

例: ; XP UR 1 [Ljava

¬íSR & java.util.concurrent.ConcurrentHashMapd™Þ‡)= I segmentMaskI segmentShift [1 [Ljava/utilに/同時/ ConcurrentHashMapのの$セグメントsegmentst: - ここにシリアル化された空のCHMです.filter.concurrentHashMap $ Segment; Rw?A2> 9t xp sr .java.util.concurrent.ConcurrentHashMap $ Segment6LX ")= F loadFactorxr(java.util.concurrent.locks.ReentrantLockfUe ,,, L synct/Ljava/util/concurrent/locks/ReentrantLock $ Sync; xpsr 4java.util.concurrent.locks.ReentrantLock $NonfairSynce2çS{xr -java.util.concurrent.locks.ReentrantLock $ Sync 'ªDZ| xr 5java.util.concurrent。 locks.AbstractQueuedSynchronizerFu¨Cu?R statexr6java.util.concurrent.locks.AbstractOwnableSynchronizer3߯¹mo©xp?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜?@ sq〜 sq〜?@ sq〜sq〜?@ sq〜sq〜 ?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜?@ sq〜sq〜 ppx

グロスここでは同じCHMはのtoString()から連載されています。少しの変換作業を行うことで

¬íさt {}

、あなたは巨大な帯域幅の節約を取得します!

public class SerializeTest { 
@Test 
public void Test() { 
// serializeanyserializable class 
} 

は、例外をスローします:

面白いです何

0

は、私が使用している場合、私のunittestのテストクラス内のシリアライズ、と私はクラス(完全に、シリアライズ)シリアライズしようとしたがCopyOnWriteArrayListとをこのように含むことであり、 java.io.NotSerializableException:SerializeTest ... at java.util.concurrent.CopyOnWriteArrayList。(CopyOnWriteArrayList.java:857)

CopyOnWriteArrayListは、デバッグ時に、SerializeTest $ 1のようなSerializeTestから派生した一時オブジェクトを使用します。

私は、テストをシリアライズ可能にしなければならないという唯一の解決策です。そして、それが突然動作し始めます。

誰か説明がありますか?

関連する問題