2012-03-10 15 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; 
      } 
     } 

私は、.NET 3.5

+0

ReadFromFileを呼び出すときにobjectTempとは何ですか?これがここの鍵です。なぜなら、それはあなたが 'type'を得ているからです。個人的には、マージしていないので、オブジェクトではなく、このメソッドに 'Type'を渡すだけです。 'オブジェクト'について話すためには、現在は 'new object()'を割り当てなければなりません。実際、 'Customer'(または何でも)を望むことを推定することはできません。 –

答えて

1

Serializer.NonGeneric.DeserializeいるProtobuf生成型を提供することを望んでprotobuf.Net v2のベータ版を使用しています。 (あなたはSystem.Objectのタイプを与えていますが、それはどうしたらいいのか分かりません)。

protocで生成されたC#コードを見て、ファイルから読み込もうとしているクラスのtypeof()を指定します。

WriteToFileが成功する場合は、objectTempのタイプを使用します。ファイルに入った型は、ファイルから出てきなければならない型です。

+0

ありがとうセスコール。私はこのステートメントを理解しているのかわかりません "protocで生成されたC#コードを見て、ファイルから読み込もうとしているクラスのtypeof()を指定してください。"異なるタイプの複数のメソッドを作成する必要があるため、 "WriteToFile"メソッドで "object"パラメータを "actual type"に変更したくありません。助言がありますか? –

+0

このようにしましょう。あなたの署名は以下のようになります: プライベートオブジェクトReadFromFile(文字列siteID、タイプobjectType、文字列fileSystemPath)。ここで、Typeはファイルに最初に入ったオブジェクトと同じタイプでなければなりません。 – sethcall

+0

あなたの答えは正しい - タイプは有意義である必要があります。 protobuf-netはコード生成の有無にかかわらず動作することができ、コード生成を使用するときは "protoc"を使用します。これは "protoc"を内部的に使用しているため、 protoc "は少し隠されています。 –

関連する問題