2011-12-10 85 views
0

我試圖通過Windows Communication Foundation傳遞一個複雜的對象,但是我得到了讀取錯誤。我能夠binaryFormat對象到一個文件並重新加載並反序列化它。所有組件/引用組件類都用Serializable屬性標記。在一輪工作中,我將對象序列化爲內存流,通過WCF傳遞內存流,然後在另一端對內存流進行deSerialized。雖然我可以接受這個解決方案,但它看起來並不是很整齊。我似乎無法確定能夠從代理中讀取哪些標準。相對簡單的對象,甚至包含對另一個類的引用的對象都可以被傳遞和讀取,而沒有任何屬性。歡迎任何意見。序列化WCF的複雜對象

編輯:無法識別的錯誤109(0x6d)System.IO.IOException讀取操作失敗。

編輯爲請求這裏的類和基類。它非常複雜,這就是爲什麼我沒有在開始時包含代碼,但它的二進制序列化很好。

[Serializable] 
public class View : Descrip 
{ 
    //MsgSentCoreDel msgHandler; 
    public Charac playerCharac { get; internal set;} 
    KeyList<UnitV> unitVs;   
    public override IReadList<Unit> units { get { return unitVs; } } 
    public View(Scen scen, Charac playerCharacI /* , MsgSentCoreDel msgHandlerI */) 
    { 
     playerCharac = playerCharacI; 
     //msgHandler = msgHandlerI; 
     DateTime dateTimeI = scen.dateTime; 
     polities = new PolityList(this, scen.polities); 
     characs = new CharacList(this, scen.characs);    
     unitVs = new KeyList<UnitV>(); 
     scen.unitCs.ForEach(i => unitVs.Add(new UnitV(this, i))); 
     if (scen.map is MapFlat)       
      map = new MapFlat(this, scen.map as MapFlat);    
     else    
      throw new Exception("Unknown map type in View constructor");    
     map.Copy(scen.map);   
    } 

    public void SendMsg(MsgCore msg) 
    { 
     msg.dateT = dateTime; 
     //msgHandler(msg); 
    } 
} 

而這裏的基類:

[Serializable] 
public abstract class Descrip 
{ 
    public DateTime dateTime { get; set; }   
    public MapStrat map { get; set; }  


    public CharacList characs { get; protected set; } 
    public PolityList polities { get; protected set; } 
    public abstract IReadList<Unit> units { get; } 
    public GridElList<Hex> hexs { get { return map.hexs; } } 
    public GridElList<HexSide> sides { get { return map.sides; } } 
    public Polity noPolity { get { return polities.none; } } 
    public double hexScale {get { return map.HexScale;}} 

    protected Descrip() 
    {         
    } 

    public MapArea newMapArea() 
    { 
     return new MapArea(this, true); 
    } 
} 
+2

如果您發佈了例外情況,我敢打賭它會明確說明您必須如何解決該問題。你可以這樣做嗎? –

+1

您可以發佈您正在使用的類的一個小例子和WCF接口方法定義嗎? –

+0

需要聽到**確切的**錯誤。如果我不得不猜測:遞歸樹 –

回答

3

我建議你看一看的MSDN documentation在WCF DataContracts,因爲它提供一些非常有用的指導。

更新

基於所提供的代碼和異常信息,有嫌疑的兩個方面:

1)集合和字典,特別是那些仿製藥爲主,總是給WCF客戶端這是一個艱難的時期,因爲它不會區分這兩種類型的對象與它認爲是相同的簽名。這通常會導致客戶端出現反序列化錯誤,所以這可能不是你的問題。

如果這是您的問題,我已經列出了我在this question的答案中採取客戶端的一些步驟。

2)您可能在層次結構的某個地方有一個不可序列化的類。

如果您的WCF服務託管在IIS中,那麼我發現的用於跟蹤這類問題的最寶貴的工具是內置的WCF記錄器。要啓用該日誌,添加以下到主配置部分你的web.config文件:

已生成的錯誤後,在svclog雙擊文件並且Microsoft Service Trace Viewer將啓動。左側的紅色項目是發生例外情況的地方,在選擇一個項目後,您可以在右側鑽入其詳細信息,並且通常會告訴您具體哪個項目存在問題。一旦我們找到了這個工具,追蹤這些問題從幾個小時到幾分鐘。

0

您應該使用DataContractDataMember屬性明確指出WCF應該將哪些字段序列化,否則還要實現ISerializable並自己寫入(解除)序列化。