c# - 是否可以在 Windows Phone 7/8 上使用 protobuf-net 序列化/反序列化不可变类型?

标签 c# windows-phone-7 windows-phone immutability protobuf-net

是否可以在 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();
            }
        }
}

最佳答案

您可以使用代理;这里我用属性装饰它,但它也可以手动配置:

[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));

序列化器将根据需要使用运算符在它们之间切换。序列化程序将使用 implicitexplicit 自定义转换运算符。

编辑: 像这样反序列化

ImmutablePoint ptDeSer = (ImmutablePoint)model.Deserialize(stream1, null, typeof(ImmutablePoint));

关于c# - 是否可以在 Windows Phone 7/8 上使用 protobuf-net 序列化/反序列化不可变类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064466/

相关文章:

c# - POST 上 PartialViews 的绑定(bind)模型

c# - ASP.NET MVC4 - Session_End - 如何在 Global.asax 的 Session_End 中获取当前登录的用户名?

c# - 如何更改时间选择器的突出显示背景?

silverlight - Windows Phone 中的 System.Windows.Browser

windows - 如何在 Applicationbar 顶部设置元素(或让布局知道它)?

xaml - 在 Splitview 中添加 ListviewItem

c# - 将域模型类型转换为 ViewModel

silverlight - VS2010 for Windows Phone 7 & Blend 崩溃与 Mvvm-Light

c# - 将所有联系人导出到 VCF (vcard) 文件 Windows Phone

c# - 在Lumia 520中使用MyToolkit播放youtube时发生错误