【发布时间】: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