c# – Protobuf-Net对ISerializable机制的回退
发布时间:2020-12-15 21:30:05 所属栏目:百科 来源:网络整理
导读:我出于性能原因使用protobuf-net,其中反序列化已保存数据的程序集与序列化它的程序集相同. 我序列化的大多数类型都是使用ProtoContract和ProtoMember属性标记的简单契约,但偶尔我必须序列化具有许多子类的奇怪对象(即:Exception). 我使用经典的ISerializabl
我出于性能原因使用protobuf-net,其中反序列化已保存数据的程序集与序列化它的程序集相同.
我序列化的大多数类型都是使用ProtoContract和ProtoMember属性标记的简单契约,但偶尔我必须序列化具有许多子类的奇怪对象(即:Exception). 我使用经典的ISerializable机制使用以下解决方法. 我是protobuf-net的新手,想知道这是不是一个好主意,是否有更好/标准的方法来做到这一点. 我的解决方法: 我定义了一个实现经典序列化的通用代理 [ProtoContract] class BinarySerializationSurrogate<T> { [ProtoMember(1)] byte[] objectData = null; public static implicit operator T(BinarySerializationSurrogate<T> surrogate) { T ret = default(T); if (surrogate == null) return ret; var serializer = new BinaryFormatter(); using (var serializedStream = new MemoryStream(surrogate.objectData)) ret = (T)serializer.Deserialize(serializedStream); return ret; } public static implicit operator BinarySerializationSurrogate<T>(T obj) { if (obj == null) return null; var ret = new BinarySerializationSurrogate<T>(); var serializer = new BinaryFormatter(); using (var serializedStream = new MemoryStream()) { serializer.Serialize(serializedStream,obj); ret.objectData = serializedStream.ToArray(); } return ret; } } 在初始化代码中,我将其添加为奇怪基类型的代理 RuntimeTypeModel.Default .Add(typeof(Exception),false) .SetSurrogate(typeof(BinarySerializationSurrogate<Exception>)); 解决方法
混合设置不是protobuf-net直接支持的场景,它不是我认为的核心用例,但是你的代理方法应该没有任何重大问题(只要程序集保持同步) .
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |