2010-07-09 52 views
3
分配現有對象

我們的任務很簡單,我們有一個對象圖,每個對象(IDItem)都有一個唯一的ID。 對象圖存在兩次,在客戶端和服務器上。ISerializable的:在反序列化

現在,我們通過一些序列化命令到服務器。該命令具有一些IDItem字段。 IDItems實現了ISerializable接口,並且只將它們的ID存儲在SerializationInfo中。像:

// The method called when serializing a IDItem. 
void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    // Instead of serializing this object, just save the ID 
    info.AddValue("ID", this.GetID()); 
} 

問題是,我們如何將現有對象分配給解串器創建的實例?顯然,類似的ISerializable的構造方法不起作用以下,因爲「這個」標識是隻讀:

//does not work 
protected IDItem(SerializationInfo info, StreamingContext context) 
{ 
    this = GlobalObject.GetIDItem(info.GetString("ID")); 
} 

所以任何想法,我們如何才能分配現有對象的反序列化對象?

最好的問候, thalm

回答

5

可能能夠通過創建一個實現IObjectReference的代理對象並執行假的反序列化。

(你的代理對象就需要在客戶端和服務器上存在,我想,你的類型版本等也將需要兩個完全一樣的。)

[Serializable] 
public class Example : ISerializable 
{ 
    // ... 

    void ISerializable.GetObjectData(
     SerializationInfo info, StreamingContext context) 
    { 
     info.SetType(typeof(ExampleDeserializationProxy)); 
     info.AddValue("ID", this.GetID()); 
    } 
} 

// ... 

[Serializable] 
public class ExampleDeserializationProxy : IObjectReference, ISerializable 
{ 
    private readonly int _id; 

    private ExampleDeserializationProxy(
     SerializationInfo info, StreamingContext context) 
    { 
     _id = info.GetInt32("ID"); 
    } 

    object IObjectReference.GetRealObject(StreamingContext context) 
    { 
     return GlobalObject.GetIDItem(_id); 
    } 

    void ISerializable.GetObjectData(
     SerializationInfo info, StreamingContext context) 
    { 
     throw new NotSupportedException("Don't serialize me!"); 
    } 
} 
+1

非常好,在助手類中實現ISerializable以獲取ID是缺少的部分...非常感謝! – thalm 2010-07-09 16:01:59

1

你不能做到這一點直接這樣。

而是整個對象序列化,但只有包括一個領域,爲什麼不直接送過來的ID,做客戶端和/或服務器上查找?如果我理解正確,服務器上已經存在該對象的一個​​實例。應該沒有理由爲什麼你需要傳遞該對象的剝離版本來再次查找同一個對象。

如果ID是唯一的並且與對象一起存儲在某個集合中,那麼將ID作爲字符串傳遞,或者是任何數據類型,都應該足以在現有的對象集合中執行查找。

+0

的問題是, IDItems(或它們的子類)是更復雜的對象(一個命令)的本身,它本身是可序列化的,因此存儲序列化ID和在服務器上找到正確對象的過程不應該在命令中完成,因爲命令的數量是相當高的,並且每個都必須存儲另一個數量的ID等等..如果序列化過程可以解決這個問題會好得多,所以在編寫命令時我們不必關心這些。 – thalm 2010-07-09 14:44:43