我想創建一個簡單的內存中網格,可以使用協議緩衝區序列化。protobuf-net:無法序列化類型數據,如何用協議緩衝區定義類型數據?
這個想法是用戶可以創建/定義任何類型的列(原語或用戶定義,只要他們是協議緩衝區標記)。
我的問題是你不能序列化類型數據與協議緩衝區,所以我怎麼能做到這一點?
代碼如下顯示我希望如何編碼網格的列。
非常感謝。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Column colOrderId = new Column("OrderId", typeof(uint));
Column colOrderDesc = new Column("OrderDesc", typeof(string));
Column colPrice = new Column("Price", typeof(Price));
Column colOrderDateTime = new Column("OrderDateTime", typeof(DateTime));
var s = colOrderId.ToBArray();
}
}
[ProtoContract, Serializable]
public sealed class Column
{
public Column(string name, Type type)
{
Name = name;
Type = type;
}
[ProtoMember(1)]
public string Name { get; private set; }
[ProtoMember(2)]
public Type Type { get; private set; }
}
[ProtoContract, Serializable]
public sealed class Price
{
public Price(double value, string currency)
{
Value = value;
Currency = currency;
}
[ProtoMember(1)]
public double Value { get; private set; }
[ProtoMember(2)]
public string Currency { get; private set; }
}
public static class ProtoBufEx
{
public static byte[] ToBArray<T>(this T o)
{
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, o);
return ms.ToArray();
}
}
}
我想在protobuf v2中,您可以爲類型添加一個用戶定義的序列化程序,該程序序列化爲該類型的名稱。 – CodesInChaos
另一個潛在的問題是你的類型是不可變的。我不確定protobuf是否支持開箱即用,或者如果您需要另一個自定義序列化程序。 – CodesInChaos
@CodeInChaos只是爲了完整性,私人設置是好的。在v1中,它也需要一個無參數的構造函數(再一次,private很好);在v2中它可以選擇性地跳過構造函數,WCF風格。 –