2

precompile.exeこのツールを使用して、Windows Phone 7 プログラムで使用できるシリアル化アセンブリを生成しようとしています。私が持っているデータ モデルは継承を使用しており、.NET 4.0 プログラムとして問題なく動作します (シリアル化が機能します)。ただし、シリアル化アセンブリを生成しようとすると、次のエラーが発生します。

Adding Program.Serialization.MessagePeer...
A type can only participate in one inheritance hierarchy
at ProtoBuf.Meta.MetaType.SetBaseType(MetaType baseType) in c:\Dev\protobuf-net\protobuf-net\Meta\MetaType.cs:line 138
at ProtoBuf.Meta.MetaType.AddSubType(Int32 fieldNumber, Type derivedType, DataFormat dataFormat) in c:\Dev\protobuf-net\protobuf-net\Meta\MetaType.cs:line 125
at ProtoBuf.Meta.MetaType.ApplyDefaultBehaviour() in c:\Dev\protobuf-net\protobuf-net\Meta\MetaType.cs:line 553
at ProtoBuf.Meta.RuntimeTypeModel.Add(Type type, Boolean applyDefaultBehaviour) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 494
at ProtoBuf.Precompile.PreCompileContext.Execute() in c:\Dev\protobuf-net\precompile\Program.cs:line 340
at ProtoBuf.Precompile.Program.Main(String[] args) in c:\Dev\protobuf-net\precompile\Program.cs:line 33

より単純なデータ モデルで問題を再現できました。

[ProtoContract]
[ProtoInclude(2, typeof(Bar))]
public abstract class Foo
{
    [ProtoMember(1)]
    public int Value { get; set; }
}

[ProtoContract]
public class Bar : Foo
{
    [ProtoMember(2)]
    public string Name { get; set; }
}

http://code.google.com/p/protobuf-net/の両方の r284 ad 2485 ビルドの protobuf を使用してみました。

コマンドラインprecompile.exeも簡単です:

D:\Projects\Program\Precompile>precompile
   "..\SerializerGen\bin\Debug\SerializerGen.dll"
   -o:MySerialization.dll
   -t:MyProgram.Serialization.PeerMessageSerializer

これは protobuf-net の既知の問題ですか、それとも何か間違っていますか?

4

1 に答える 1

1

うーん; System.Reflection と IKVM.Reflection が継承された属性を報告する方法に少し違いがありました。つまり、(IKVM.Reflection を使用する) プリコンパイラは、継承 ProtoIncludeAttributeされたに加えて (1 ではなく) 2を認識していましたProtoContractAttribute

これは r571 で修正されています

于 2012-08-10T06:14:54.527 に答える