如何配置protobuf-net的RuntimeModel.Default支持SessionSecurityToken的序列化/反序列化?BinaryFormatter可以轻松处理序列化:privatebyte[]TokenToBytes(SessionSecurityTokentoken){if(token==null){returnnull;}使用(varmemoryStream=newMemoryStream()){varbinaryFormatter=newBinaryFormatter();binaryFormatter.Serialize(memoryStream,token);返回memoryStream.ToArray();当我尝试用protobuf-net替换BinaryFormatter时:返回内存流.ToArray();我得到以下异常:Typenotexpected,andcontractcouldnotbeinferred:System.IdentityModel.Tokens.SessionSecurityToken我尝试添加:RuntimeTypeModel.Default.Add(typeof(SessionSecurityToken),true);这超出了异常,但我现在得到一个零字节数组。如何正确配置protobuf-net以序列化SessionSecurityToken?另一方面,SessionSecurityToken没有无参数的构造函数。使用(varmemoryStream=newMemoryStream(tokenAsBytes)){returnSerializer.Deserialize(memoryStream);}抛出ProtoException:SessionSecurityToken的无参数构造函数发现BinaryFormatter能够在没有BinaryFormatter的情况下执行此操作:返回(SessionSecurityToken)binaryFormatter.Deserialize(memoryStream);如何正确配置protobuf-net以反序列化SessionSecurityToken?protobuf-net并不声称能够序列化每种类型;事实上,通过大多数序列化程序(XmlSerializer、任何json序列化程序、DataContractSerializer等)进行序列化将很困难。BinaryFormatter属于不同类别的序列化程序-在这种特定情况下,通过ISerializable.GetObjectData(SerializationInfo,StreamingContext)实现自定义序列化程序。构造函数是一条红鲱鱼;事实上,protobuf-net可以完全绕过构造函数,在这种特殊情况下,BinaryFormatter通过.ctor(SerializationInfo,StreamingContext)使用自定义序列化构造函数。对于简单的情况,可以通过属性或运行时选项配置protobuf-net;对于更复杂的场景,可以使用代理在表示之间进行映射——但是,在这种情况下,我建议(参见SessionSecurityToken的实现)这比您可能想要维护的更复杂。我会在这里退后一步;大多数序列化器设计用于处理数据,而不是实现-并且可以与DTO等一起使用。SessionSecurityToken非常不是DTO,并且没有简单的方法在它们之间切换。我强烈的建议是:序列化这代表什么,而不是它是什么。但是,如果这是现有复杂模型的一部分并且真的很难分离出来,那么可以切换回BinaryFormatter来提取位。我没有测试过这个,但考虑一下:RuntimeTypeModel.Default.Add(typeof(SessionSecurityToken),false).SetSurrogate(typeof(BinaryFormatterSurrogate));P.S.:[ProtoContract]publicclassBinaryFormatterSurrogate{[ProtoMember(1)]publicbyte[]Raw{get;放;}publicstaticexplicitoperatorT(BinaryFormatterSurrogatevalue){if(value==null||value.Raw==null)returndefault(T);使用(varms=newMemoryStream(value.Raw)){return(T)newBinaryFormatter()。反序列化(毫秒);}}publicstaticexplicitoperatorBinaryFormatterSurrogate(Tvalue){objectobj=value;如果(obj==null)返回null;使用(varms=newMemoryStream()){newBinaryFormatter().Serialize(ms,obj);返回新的BinaryFormatterSurrogate{Raw=ms.ToArray()};请记住,这只是将序列化程序的输出作为原始数据嵌入到另一个序列化程序中。幸运的是,protobuf-net很乐意谈论二进制文件,因此这不会增加任何明显的开销(只是blob的标头和长度前缀)——但它也不会对SessionSecurityToken实例做任何特别聪明或巧妙的事情。如果那是您唯一要序列化的东西,那真的不值得。如果它只是较大的DTO模型中的一个丑陋的颠簸,其中大部分都可以很好地序列化-那么它可能会为您完成这项工作。以上是C#学习教程:如何配置protobuf-net的RuntimeModel.Default支持SessionSecurityToken的序列化/反序列化?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
