我有數十億個對象,我試圖在B +樹中將它們構造爲序列化到HDD。我使用數據結構的BPlusTree庫和序列化/反序列化的protobuf-net。在這方面,我定義我類爲:Protobuf-net與泛型進行反序列化時要求TypeModel.CS
[ProtoContract]
public class B<C, M>
where C : IComparable<C>
where M : IData<C>
{
internal B()
{
lambda = new List<Lambda<C, M>>();
omega = 0;
}
internal B(C coordinate)
{
lambda = new List<Lambda<C, M>>();
e = coordinate;
omega = 0;
}
[ProtoMember(1)]
internal C e { set; get; }
[ProtoMember(2)]
internal List<Lambda<C, M>> lambda { private set; get; }
[ProtoMember(3)]
internal int omega { set; get; }
}
[ProtoContract]
public class Lambda<C, M>
where C : IComparable<C>
where M : IData<C>
{
internal Lambda() { }
internal Lambda(char tau, M atI)
{
this.tau = tau;
this.atI = atI;
}
[ProtoMember(1)]
internal char tau { private set; get; }
[ProtoMember(2)]
internal M atI { private set; get; }
}
和我定義我串行/解串器如下:
public class BSerializer<C, M> : ISerializer<B<C, M>>
where C : IComparable<C>
where M : IData<C>
{
public B<C, M> ReadFrom(System.IO.Stream stream)
{
return Serializer.Deserialize<B<C, M>>(stream);
}
public void WriteTo(B<C, M> value, System.IO.Stream stream)
{
Serializer.Serialize<B<C, M>>(stream, value);
}
}
然後我使用它們都在一個B +樹(This library)數據結構,其定義爲:
var options = new BPlusTree<C, B<C, M>>.OptionsV2(CSerializer, BSerializer);
var myTree = new BPlusTree<C, B<C, M>>(options);
B +樹被定義爲鍵值對的字典。我的key
(即,C
)是一個整數,串行器是默認的串行器BPlusTree
庫。我的Value
是使用protobuf-net
序列化的自定義對象B<C,M>
。
我的問題肯定會發生,但幾乎在隨機時間;總是搜索Keys
,它突然開始反序列化Value
,並在第一次調用B<C, M> ReadFrom(System.IO.Stream stream)
時要求輸入TypeModel.CS
和ProtoReader.CS
文件。我從NuGet
獲得兩個包。
要求輸入文件只是意味着它捕獲的異常,你必須調試符號;什麼是實際的異常消息? – 2014-10-06 13:02:35
@MarcGravell例外是:'源數據中的無效字段:0' – Hamed 2014-10-06 13:12:13
*通常*表示實際數據無效 - 這裏的更廣泛的上下文是什麼?你是從什麼序列化/反序列化? – 2014-10-06 13:25:07