3

Windows Phone 7/8 で protobuf-net を使用して型をシリアル化/逆シリアル化することは可能ですか?
以下のコードを試してみましたが、コンストラクターのスキップがサポートされていないようです (つまり、UseConstructor = false) ため、パラメーターなしのコンストラクターを作成しましたが、「メソッドにアクセスしようとして失敗しました: Wp7Tests.ImmutablePoint.set_X(System.Double )"

public class ImmutablePoint
{
    public double X { get; private set; }
    public double Y { get; private set; }
    public ImmutablePoint() {}

    public ImmutablePoint(double x, double y)
    {
        X = x;
        Y = y;
    }
}
public sub Test()
{
        ImmutablePoint pt = new ImmutablePoint(1, 2);
        var model = TypeModel.Create();
        var ptType = model.Add(typeof(ImmutablePoint), false);
        ptType.AddField(1, "X");
        ptType.AddField(2, "Y");
        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();

        using (var stream1 = new IsolatedStorageFileStream("test.bin", FileMode.Create, store))
        {
            try
            {
                model.Serialize(stream1, pt);
            }
            catch (Exception e)
            {                    
                Debugger.Break();
            }
        }
        const double EPSILON = 0.001;
        using (var stream1 = new IsolatedStorageFileStream("test.bin", FileMode.Open, store))
        {
            try
            {
                ImmutablePoint ptDeSer = (ImmutablePoint) model.Deserialize(stream1,null, typeof(ImmutablePoint));
                Debug.Assert(Math.Abs(pt.X - ptDeSer.X) < EPSILON);
                Debug.Assert(Math.Abs(pt.Y - ptDeSer.Y) < EPSILON);
            }
            catch (Exception e)
            {
                Debugger.Break();
            }
        }
}
4

2 に答える 2

8

サロゲートを使用できます。ここでは属性で装飾していますが、手動でも構成できます。

[ProtoContract]
public class MutablePoint {
    [ProtoMember(1)] public double X { get; set; }
    [ProtoMember(2)] public double Y { get; set; }

    public static implicit operator MutablePoint(ImmutablePoint value) {
        return value == null ? null : new MutablePoint {X=value.X, Y=value.Y};
    }
    public static implicit operator ImmutablePoint(MutablePoint value) {
        return value == null ? null : new ImmutablePoint(value.X, value.Y);
    }
}

そして、次のことがわかった場合はいつでもこれを使用するようにモデルに指示しますImmutablePoint

var model = TypeModel.Create();
model.Add(typeof(MutablePoint), true);
model.Add(typeof(ImmutablePoint), false).SetSurrogate(typeof(MutablePoint));

シリアライザーは、必要に応じて演算子を使用してそれらを切り替えます。シリアライザは、implicitまたはexplicitカスタム変換演算子を使用します。

編集:このように逆シリアル化します

ImmutablePoint ptDeSer = (ImmutablePoint)model.Deserialize(stream1, null, typeof(ImmutablePoint));
于 2013-04-18T06:34:36.057 に答える