2012-03-10 173 views
1

我使用ProtoBuf來序列化類。不幸的是,Serializer.Deserialize方法給出錯誤「類型不是預期的,並且不能推斷出合同:System.Object」。任何提示如何解決這個問題。ProtoBuf類型鑄造問題

private void WriteToFile(string siteID, object objectTemp, stringfileSystemPath) 
     { 
      var type = objectTemp.GetType(); 
using (var file = File.Create(fileSystemPath)) 
       { 
        Serializer.NonGeneric.Serialize(file, objectTemp); 
       } 
     } 

private object ReadFromFile(string siteID, object objectTemp, stringfileSystemPath) 
     { 
      Type type = objectTemp.GetType(); 
      object objectTemp2=null; 
       using (var file = File.OpenRead(fileSystemPath)) 
       { 
        objectTemp2 = Serializer.NonGeneric.Deserialize(type, file); 
       } 
       return objectTemp2; 
      } 
     } 

我使用protobuf.Net V2測試與.net 3.5

+0

當您調用ReadFromFile時objectTemp是什麼?這是關鍵,因爲那是你從中獲取'type'的地方。就個人而言,因爲你沒有合併,所以我只是將'Type'傳遞給這個方法,而不是一個對象。爲了討論'object',你現在必須爲它分配一個'new object()' - 所以確實,它不能推斷出你需要一個'Customer'(或其他)。 – 2012-03-10 08:15:10

回答

1

Serializer.NonGeneric.Deserialize希望提供一個protobuf的生成類型。 (你給它的類型是System.Object,它不知道該怎麼做)。

看看protoc生成的C#代碼,並指定要從文件中讀取的類的typeof()

或換句話說,如果WriteToFile成功,則使用objectTemp的類型。進入文件的類型是需要從文件中取出的類型。

+0

感謝SethCall。我不確定我是否理解這個說法,「看看​​protoc生成的C#代碼,並指定你想從文件中讀取的類的typeof()。」我不想將「object」參數更改爲「WriteToFile」方法中的「實際類型」,因爲我必須爲不同類型創建多個方法。有什麼建議麼? – 2012-03-10 05:35:17

+0

讓我們這樣說吧;你的簽名應該說: 私人對象ReadFromFile(string siteID,Type objectType,string fileSystemPath),其中Type應該是最初進入文件的同一類型的對象。 – sethcall 2012-03-10 06:07:04

+0

你的回答是正確的 - 類型確實需要有意義;然而,對於中間線有任何困惑:protobuf-net可以使用或不使用代碼生成,並且當它使用代碼生成時,它使用在內部使用「protoc」的「protogen」 - 因此使用「 protoc「稍微隱藏。 – 2012-03-10 08:17:43