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 に答える