2012-03-10 174 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