c# - 尝试序列化 PropertyInfo 时引发异常

标签 c# .net protobuf-net

应该支持序列化 PropertyInfo 吗?如果不是,最好的解决方法是什么?我知道可以序列化类型(受支持),然后通过其属性查找属性 - 想象一下查找可能很昂贵。

附注PropertyInfo 用于实现类似于 DataLoadOptions.LoadWith http://msdn.microsoft.com/en-us/library/bb548760.aspx 的功能.

using System.IO;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ProtoBuf;

[ProtoContract]
public class A
{
    [ProtoMember(1)]
    public PropertyInfo Property { get; set; }
}

[TestClass]
public class UnitTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var value = new A { Property = typeof(string).GetProperty("Length") };
        using (var stream = new MemoryStream())
        {
            // Raises InvalidOperationException
            // "No serializer defined for type: System.Reflection.PropertyInfo"
            Serializer.Serialize(stream, value);
        }
    }
}

引发 InvalidOperationException 时的调用堆栈:

protobuf-net.dll!ProtoBuf.Meta.ValueMember.BuildSerializer() Line 316   C#
protobuf-net.dll!ProtoBuf.Meta.ValueMember.Serializer.get() Line 188 + 0x24 bytes   C#
protobuf-net.dll!ProtoBuf.Meta.MetaType.BuildSerializer() Line 421 + 0x1f bytes C#
protobuf-net.dll!ProtoBuf.Meta.MetaType.Serializer.get() Line 344 + 0xe bytes   C#
protobuf-net.dll!ProtoBuf.Meta.RuntimeTypeModel.Serialize(int key, object value, ProtoBuf.ProtoWriter dest) Line 592 + 0x44 bytes   C#
protobuf-net.dll!ProtoBuf.Meta.TypeModel.SerializeCore(ProtoBuf.ProtoWriter writer, object value) Line 178 + 0x14 bytes C#
protobuf-net.dll!ProtoBuf.Meta.TypeModel.Serialize(System.IO.Stream dest, object value, ProtoBuf.SerializationContext context) Line 209 + 0xe bytes C#
protobuf-net.dll!ProtoBuf.Meta.TypeModel.Serialize(System.IO.Stream dest, object value) Line 193 + 0x10 bytes   C#
protobuf-net.dll!ProtoBuf.Serializer.Serialize<TestProtoBufNet.A>(System.IO.Stream destination, TestProtoBufNet.A instance) Line 88 + 0x18 bytes    C#
TestProtoBufNet.dll!TestProtoBufNet.UnitTest.TestMethod1() Line 24 + 0x10 bytes C#

最佳答案

要添加@ikh 已经说过的内容,不,那不是受支持的类型。当我提到标准 BCL 类型时,我指的是公共(public)数据 类型,而不是反射类型。 protobuf 和 protobuf-net 的全部要点是以数据为中心,但是 PropertyInfo 等是实现,而不是数据。事实上,对于 PropertyInfo 应该有多少信息,WinRT 有一个非常不同的想法。

但是!如果您决定对其进行序列化,请注意 Type 受 IIRC 支持。所以你可以通过代理来做到这一点(完全未经测试,我在 iPad 上!):

[ProtoContract]
public class PropertyInfoSurrogate {
    [ProtoMember(1)]
    public Type Type { get; set; }
    [ProtoMember(2)]
    public string Name { get; set; }

    public static operator implicit PropertyInfoSurrogate(PropertyInfo value) {
        if(value == null) return null;
        return new PropertyInfoSurrogate {
             Type = value.DeclaringType, Name = value.Name
        };
    }
    public static operator implicit PropertyInfo(PropertyInfoSurrogate value) {
        if(value == null) return null;
        return value.Type.GetProperty(value.Name);
    }
}

然后,到你的模型:

model.Add(typeof(PropertyInfo), false)
    .SetSurrogate(typeof(PropertyInfoSurrogate));

强调:完全未经测试,但类似的东西应该可以工作。让我知道你的进展情况。

关于c# - 尝试序列化 PropertyInfo 时引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11690807/

相关文章:

asp.net - Azure .Net WebApp 部署失败,但可以在 VS 本地运行

network-protocols - protobuf-net v2 类型元

c# - 如何通过 RDP 连接可靠地 "PrintScreen"(保存屏幕内容)?

c# - 在它的 "taking a screenshot"之前等待 UI 重绘

.net - 使 .NET 截图工具与多个监视器兼容

c# - Protobuf-net 没有序列化?输出近乎纯文本

c# confluence.kafka 无法使用 Protobuf-net 反序列化 protobuf 消息

c# - 处理绑定(bind) MVVM 属性中未捕获的异常

c# - ASP.net MVC core RedirectToPage错误-指定根相对路径错误

c# - .Net 2.0 的 XDocument?