現在のServicestack実装でMessagePackプロトコルをサポートしようとしています。次のように定義されたISegmentのリストの(逆)シリアル化をサポートするために必要です。
[KnownType(typeof(ArcSegment)), KnownType(typeof(LineSegment))]
public class PathRequest
{
public List<ISegment> Segments {get;set;}
}
public interface ISegment
{
Point StartPoint {get;set;}
Point EndPoint {get;set;}
}
public class ArcSegment: ISegment {...}
public class LineSegment: ISegment {...}
箱から出して、それは私にそれを教えてくれました
タイプ'Asi.Geometry.ISegment'には、デフォルト(パラメーターなし)のパブリックコンストラクターとInt32パラメーターを持つパブリックコンストラクターの両方がありません。
それは非常に真実です。どうやらそれはKnownType属性を使用していません。オンラインで読んだ後、私は自分のシリアライザーを作成できることを発見しました。したがって、私はこれを試しました:
class ArcLineSerializer: MessagePackSerializer<ISegment>
{
private readonly MessagePackSerializer<ArcSegment> _arcSerializer = MessagePackSerializer.Create<ArcSegment>();
private readonly MessagePackSerializer<LineSegment> _lineSerializer = MessagePackSerializer.Create<LineSegment>();
protected override void PackToCore(Packer packer, ISegment objectTree)
{
if(objectTree is ArcSegment)
_arcSerializer.PackTo(packer, (ArcSegment)objectTree);
else if (objectTree is LineSegment)
_lineSerializer.PackTo(packer, (LineSegment)objectTree);
else
throw new NotSupportedException();
}
protected override ISegment UnpackFromCore(Unpacker unpacker)
{
var data = unpacker.Data;
if (data != null)
{
if (data.Value.IsTypeOf<ArcSegment>().GetValueOrDefault())
return _arcSerializer.UnpackFrom(unpacker);
if (data.Value.IsTypeOf<LineSegment>().GetValueOrDefault())
return _lineSerializer.UnpackFrom(unpacker);
throw new NotSupportedException();
}
return null;
}
}
残念ながら、_arcSerializerを作成しようとすると同じエラーが発生します。どうですか?