c# – protobuf和List – 如何序列化反序列化?

c# – protobuf和List – 如何序列化反序列化?,第1张

概述我有一个List< object>包含不同类型的对象,如整数,字符串和自定义类型.所有自定义类型都是protobuf调整. 我现在要做的是使用protobuf.net序列化/反序列化此列表.到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的.因为二元形成器没有问题做这些事情我希望我错过了一些东西,你可以帮助我. 所以我的问题是如何处理protobuf.net中的对象. 我有一个List< object>包含不同类型的对象,如整数,字符串和自定义类型.所有自定义类型都是protobuf调整.
我现在要做的是使用protobuf.net序列化/反序列化此列表.到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的.因为二元形成器没有问题做这些事情我希望我错过了一些东西,你可以帮助我.
所以我的问题是如何处理protobuf.net中的对象.解决方法 (披露:我是protobuf网的作者)

BinaryFormatter是一个基于元数据的序列化器;即它发送有关序列化的每个对象的.NET类型信息. protobuf-net是一个基于契约的序列化器(XmlSerializer / DataContractSerializer的二进制等价物,它也会拒绝这个).

目前没有传输任意物体的机制,因为另一端无法知道你发送的是什么;但是,如果您要发送一组已知的不同对象类型,则可能有选项.管道中还有一些工作允许运行时可扩展的模式(而不仅仅是在构建时修复的属性) – 但这远非完整.

这不是理想的,但它可以工作……当我完成支持运行时模式的工作时应该更容易:

using System;using System.Collections.Generic;using ProtoBuf;[ProtoContract][ProtoInclude(10,typeof(DataItem<int>))][ProtoInclude(11,typeof(DataItem<string>))][ProtoInclude(12,typeof(DataItem<DateTime>))][ProtoInclude(13,typeof(DataItem<Foo>))]abstract class DataItem {    public static DataItem<T> Create<T>(T value) {        return new DataItem<T>(value);    }    public object Value {        get { return ValueImpl; }        set { ValueImpl = value; }    }    protected abstract object ValueImpl {get;set;}    protected DataItem() { }}[ProtoContract]sealed class DataItem<T> : DataItem {    public DataItem() { }    public DataItem(T value) { Value = value; }    [ProtoMember(1)]    public new T Value { get; set; }    protected overrIDe object ValueImpl {        get { return Value; }        set { Value = (T)value; }    }}[ProtoContract]public class Foo {    [ProtoMember(1)]    public string bar { get; set; }    public overrIDe string ToString() {        return "Foo with bar=" + bar;    }}static class Program {    static voID Main() {        var items = new List<DataItem>();        items.Add(DataItem.Create(12345));        items.Add(DataItem.Create(DateTime.Today));        items.Add(DataItem.Create("abcde"));        items.Add(DataItem.Create(new Foo { bar = "marc" }));        items.Add(DataItem.Create(67890));        // serialize and deserialize        var clone = Serializer.DeepClone(items);        foreach (DataItem item in clone) {            Console.Writeline(item.Value);        }    }}
总结

以上是内存溢出为你收集整理的c# – protobuf和List – 如何序列化/反序列化?全部内容,希望文章能够帮你解决c# – protobuf和List – 如何序列化/反序列化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1249920.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存