我正在使用protobuf-net库来加速wcf序列化,现在我遇到了派生类的问题。我查看了几个关于类派生的讨论,但没有一个适合我的问题。
我使用以下基础:
[DataContract, ProtoContract]
//[ProtoInclude(10000, typeof(SysLoginRequest))]
public class ServiceRequest
{
public ServiceRequest()
{
// No parameterless constructor found for ServiceRequest?
RuntimeTypeModel.Default.Add(typeof(ServiceRequest), true).AddSubType(10000, typeof (SysLoginRequest));
}
}
派生类:
[DataContract, ProtoContract]
public class SysLoginRequest : ServiceRequest, IServiceRequest<SysLoginResponse>
{
[DataMember(Order = 1, IsRequired = true)]
public string UserSid { get; set; }
[DataMember(Order = 2, IsRequired = true)]
public string UserName { get; set; }
[DataMember(Order = 3, IsRequired = true)]
public string Password { get; set; }
[DataMember(Order = 4, IsRequired = true)]
public string IpAddress { get; set; }
[DataMember(Order = 5)]
public string ProcessName { get; set; }
[DataMember(Order = 6)]
public int ProcessId { get; set; }
}
我要做的是通过在运行时添加子类来摆脱属性,但在我的测试中,我总是得到运行时错误,基类没有无参数构造函数?我试图使构造函数静态,但这也没有帮助。
如果我使用该属性(并删除构造函数)一切都很好,但如果我使用RuntimeTypeModel执行此操作,则会收到错误消息。我在这里做错了什么?
答案 0 :(得分:2)
好的,我现在就开始工作了。混合初始化存在问题。我仍然在某些类上有一些ProtoInclude-decorators,并尝试使用RuntimeTypeModel添加子类型。
我最终得到了一个小型的初始化课程:
public static class ProtoBufInitializer
{
private static readonly object ClassSync = new object();
private static bool _initialized;
public static void Initialize()
{
lock (ClassSync)
{
if (!_initialized)
{
ProcessTypes<ServiceRequest>();
ProcessTypes<ServiceResponse>();
_initialized = true;
}
}
}
private static void ProcessTypes<T>()
{
int tag = 10000;
foreach (var type in ReflectionUtils.FindAllDerivedTypes<T>())
{
if (type.IsClass && !type.IsAbstract)
RuntimeTypeModel.Default.Add(typeof (T), true).AddSubType(tag++, type);
}
}
}
使用protobuf-net序列化后更改RuntimeTypeModel导致了另一个问题。