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
....
但我希望尽可能少用代码。
使用Serializer.NonGeneric类有什么缺点吗? – Tomas
@Tomas无论如何;在* regular *代码中,它有点不太方便(因为您可能需要给某些方法一个'Type'实例和一个cast或两个等),但是对于您正在做的事情 - 它是预期的API。 –