没有属性的Protobuf-net派生类会导致运行时错误

时间:2013-07-14 13:22:56

标签: protobuf-net

我正在使用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执行此操作,则会收到错误消息。我在这里做错了什么?

1 个答案:

答案 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导致了另一个问题。