2011-09-02 93 views
1

我使用ProtoBuf序列化在运行时使用Activator.CreateInstance创建的类。 不幸的是,Serializer.Deserialize方法给出错误“类型不是预期的,并且不能推断出合同:System.Object”。任何提示如何解决这个问题。ProtoBuf类型投射问题

var converterName = "Passing class name as string" 
var type = Type.GetType(converterName); 
      var yourObject = Activator.CreateInstance(type) 
      if (yourObject != null) 
      { 

       FillRequest(Request.Params, yourObject); 
       var com = new CommunicationLayer(); 
       yourObject = com.Submit(yourObject); 
       FillResponse(yourObject); 
      } 

public class CommunicationLayer 
{ 
public T Submit<T>(T engine) 
{ 
<code skip> 
Serializer.Serialize(stream, engine); //Works fine 
<code skip> 

    engine = Serializer.Deserialize<T>(stream); //Gives error 

<code skip> 
} 
} 

我选择通过串运行时创建和铸造类,因为converterName变量参数在ASP.NET应用程序通过,这样的班会约100是的,我可以取代100如果的

整个代码
If converterName=="MyClass1" 
{ 
var yourObject = new MyClass1(); 
FillRequest(Request.Params, yourObject); 
       var com = new CommunicationLayer(); 
       yourObject = com.Submit(yourObject); 
       FillResponse(yourObject); 
} 
    Else 
If converterName=="MyClass2" 
{ 
var yourObject = new MyClass2(); 
FillRequest(Request.Params, yourObject); 
       var com = new CommunicationLayer(); 
       yourObject = com.Submit(yourObject); 
       FillResponse(yourObject); 
} 
    Else 
.... 

但我希望尽可能少用代码。

回答

3

这是因为通用方法是推断T = object。

有一种非通用API用于此场景;看Serializer.NonGeneric。*

或者在v2中,下TypeModel/RuntimeTypeModel(其中现在所有的“真实”的代码),一切都是整个非通用。

如果你正在做这件事,我推荐使用v2。在v1中,通用代码是“主要”代码,非泛型代码使用反射通过MakeGenericMethod()(相对昂贵)填充到通用代码中。在v2中,这是相反的:非泛型代码是“主要”代码,泛型方法通过typeof(T)垫入非泛型API。

+0

使用Serializer.NonGeneric类有什么缺点吗? – Tomas

+0

@Tomas无论如何;在* regular *代码中,它有点不太方便(因为您可能需要给某些方法一个'Type'实例和一个cast或两个等),但是对于您正在做的事情 - 它是预期的API。 –