C# 做一个”的最好方法;“数据包”;用protobuf net序列化的?

C# 做一个”的最好方法;“数据包”;用protobuf net序列化的?,c#,serialization,protobuf-net,C#,Serialization,Protobuf Net,我一直很难找到创建“数据包”类的最佳方法,该类还可以使用Protobuf Net的轻量级序列化对其数据进行序列化,为此我创建了自己的类型模型。我试图避免将数据存储为对象。基本上,可以做的事情: DataBag bag = new DataBag(); bag.Add<T>("dataName", value); bag.Get<T>("dataName"); bag类构建了两个静态排序字典和一个将被序列化的字典,如下所示: private static Diction

我一直很难找到创建“数据包”类的最佳方法,该类还可以使用Protobuf Net的轻量级序列化对其数据进行序列化,为此我创建了自己的类型模型。我试图避免将数据存储为对象。基本上,可以做的事情:

DataBag bag = new DataBag();

bag.Add<T>("dataName", value);
bag.Get<T>("dataName");
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);
私有静态字典值集{get;set;}
私有静态字典ValueGet{get;set;}
专用字典数据{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]);
}
public void Add(字符串名称、对象值)
{
基准面=新基准面();
值集[类型(T)](值、基准);
数据。添加(名称、数据);
}
公共T获取(字符串名称)
{
返回(T)值获取[类型(T)](数据[名称]);
}

这种方法的问题是,随着可序列化对象数量的增加,我必须继续维护该类,并在排序字典上添加新条目,同时在数据包装器上添加更多成员。有更简单的方法吗?

protobuf net不是为存储数据包而设计的;它设计用于已知的契约,至少是因为protobuf格式对元数据的要求很低


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

您能否解释一下为什么要避免将数据存储在对象字段中?请列出缺点。然后描述您当前的解决方案的优越性。我在对象中存储数据时遇到的问题是Protobuf Net的序列化,我发现序列化对象的唯一方法是通过DynamicType属性,但是它不允许对象是基元类型。通用包装器类能帮上忙吗?我设法使用通用包装器类使其工作,但是,如果只有一个数据字典接受所有不同的通用数据对象,最好的方法是什么?我唯一能想到的是创建一个基类,Datum从中派生并生成字典,但是在protobuf中,我必须通过属性指定所有派生类,因此我仍然必须为每个新的可序列化类在模型上添加一个新属性和新类型。还有更简单的方法吗?谢谢你的回答!我理解这是对Protobuf网络设计的过度扩展。事后看来,我只是选择了我能找到的最快的序列化程序,而没有首先考虑它是否适合我所需要的,这是一个错误。最终,我成功地使用了通用包装器和运行时模型。谢谢你!
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]);
}