2

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

4

1 回答 1

2

好的,我现在开始工作了。混合初始化存在问题。我仍然在某些类上有一些 ProtoInclude 装饰器,并尝试使用 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 会导致另一个问题。

于 2013-07-14T22:07:56.700 回答