2

次のクラスとWCFサービスがあります(シリアル化にprotobuf-netを使用)。

[DataContract]
[KnownType(typeof(NamedViewModel))]
public class NamedViewModel<TKey> : IViewModel
{
    [DataMember]
    public virtual TKey Id { get; set; }

    [DataMember]
    public virtual string Name { get; set; }
}

[DataContract]
[KnownType(typeof(ScheduleTemplateViewModel))]
public class NamedViewModel : NamedViewModel<int>
{
}

[DataContract]
public class ScheduleTemplateViewModel : NamedViewModel
{
    [DataMember]
    public string Comment { get; set; }
}

[DataContract]
public class Container
{
    [DataMember]
    public IEnumerable<ScheduleTemplateViewModel> Templates { get; set; }
}

[ServiceContract]
public interface IService
{
    [OperationContract]
    Container Get();
}

public class Service : IService
{
    public IEnumerable<Container> Get()
    {
        return new Container { Templates = Enumerable.Range(1, 10)
            .Select(i => CreateTemplate()).ToArray() };
    }

    private void ScheduleTemplateViewModel CreateTemplate()
    { 
        var instance = WindsorContainer.Resolve<ScheduleTemplateViewModel>();
        // populate instance
        return instance;
    }
}

2つの問題があります。

  1. シリアル化中に、ScheduleTemplateViewModelのCastleDynamicProxyタイプが予期しないという例外が発生します。protobuf-netには、NHibernateプロキシとEntityFrameworkプロキシを処理するカスタムコードがありますが、CastleDynamicProxiesはありません。これを回避するには、protobuf-netソースコードにcaseステートメントを追加して、CastleのIProxyTargetAccessorタイプをチェックします...しかし、protobuf-netソースコードを変更せずにこれを処理する方法があれば便利です...

  2. ScheduleTemplateViewModelのメンバー(つまりComment)は正しくシリアル化されますが、基本クラスのメンバーは正しくシリアル化されません。RuntimeTypeModel.DefaultではすでにInferTagFromNameDefaultがtrueに設定されています。

4

1 に答える 1

1
  1. 私はそれを追加することができます。そのインターフェイスのフルネーム(名前空間を含む)を教えてください。

  2. あなたが与える例から、それらの値のどれも必要な数値のフィールド番号情報を含んでいないので、それらの値のどれもシリアル化するべきではありません。シリアル化するものもあるとおっしゃってますので、これはコピー/貼り付けの省略だと思います。Protobuf-netは、より良いものがない場合Order=nからの情報を使用しようとします。[DataMember(...)]ただし、protobuf-netはを使用できないことを強調する必要がある場合[KnownType(...)]、継承には明示的な数値のフィールド番号情報が必要です。これは、を介して最も簡単に追加[ProtoInclude(...)]できますが、実行時に提供することもできます

于 2013-03-04T06:40:02.760 に答える