【问题标题】:Best way to make a "Data Bag" that serializes with protobuf-net?制作使用 protobuf-net 序列化的“数据包”的最佳方法?
【发布时间】:2014-03-26 05:23:15
【问题描述】:

我一直很难弄清楚创建“数据包”类的最佳方法是什么,该类还可以使用 Protobuf-Net 的轻量级序列化来序列化其数据,为此我创建了自己的 TypeModel。我试图避免将数据存储为对象。基本上,可以做的事情:

DataBag bag = new DataBag();

bag.Add<T>("dataName", value);
bag.Get<T>("dataName");

我的解决方案是创建一个包装类,其中包含我的每个可序列化类型的成员,然后使用两个排序字典,其键是我的类型,并提供正确的操作来设置和获取值,如下所示:

public class Datum
{
    public int AsInt;
    public string AsString;
    public bool AsBool;
    public int[] AsIntArray;
    public string[] AsStringArray;
    public bool[] AsBoolArray;
}

bag 类构建了两个静态排序字典和将被序列化的字典,如下所示:

private static Dictionary<Type, Action<Object, Datum>> ValueSet { get; set; }
private static Dictionary<Type, Func<Datum, Object>> ValueGet { get; set; }

private Dictionary<string, Datum> Data { get; set; }

....

ValueSet.Add(typeof(int), (value, datum) => datum.AsInt = (int)value);
ValueGet.Add(typeof(int), (datum) => datum.AsInt);

然后是我做的方法本身:

public void Add<T>(string name, Object value)
{
    Datum datum = new Datum();
    ValueSet[typeof(T)](value, datum);
    Data.Add(name, datum);
}

public T Get<T>(string name)
{
    return (T)ValueGet[typeof(T)](Data[name]);
}

我使用这种方法遇到的问题是,随着可序列化对象数量的增加,我必须继续维护类并在排序字典中添加新条目以及在 Datum 包装器上添加更多成员。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 您能解释一下为什么要避免将数据存储在对象字段中吗?请列出缺点。然后描述您当前的解决方案如何优越。
  • 我在对象中存储数据时遇到的问题是使用 Protobuf-Net 进行序列化,我发现序列化对象的唯一方法是通过 DynamicType 属性,但它没有允许对象是原始类型。
  • 通用包装类有帮助吗?
  • 我设法使用通用包装类使其工作,但是只有一个接受所有不同通用 Datum 对象的数据字典的最佳方法是什么?我唯一能想到的是创建一个基类,从中派生 Datum 并创建 Dictionary,但是在 protobuf 中我必须通过属性指定所有派生类,所以我仍然必须在模型上为每个新的可序列化类添加一个新属性和新类型。有没有更简单的方法?

标签: c# serialization protobuf-net


【解决方案1】:

protobuf-net 不是设计来存储数据包的;它旨在与已知合约一起使用,至少因为 protobuf 格式对元数据非常轻。

可以也许使用扩展数据 API,但问题是数据没有 names(因为 protobuf 格式从不存储名称) - 它有字段编号。如果您可以使用 numbers,则内置了对存储、检索和往返 ad-hoc 数据的支持。

【讨论】:

  • 感谢您的回答!我知道这是过度扩展 Protobuf-Net 的设计。事后看来,我只是选择了我能找到的最快的序列化程序,而没有首先考虑它是否适合我的需要,这是一个错误。最终,我确实设法让它与通用包装器和运行时模型一起工作。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2021-05-18
相关资源
最近更新 更多