У меня есть миллиарды объектов, которые я пытаюсь структурировать в дереве B +, сериализованном на HDD. Я использую библиотеку BPlusTree для структуры данных и protobuf-net для сериализации/десериализации. В связи с этим я определяю свои классы как:Protobuf-net запрашивает TypeModel.CS при использовании с Generics для десериализации
[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; }
}
и определяю мои сериализаторы/deserializers следующим образом:
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 + Tree (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
- это настраиваемый объект B<C,M>
, который сериализуется с использованием protobuf-net
.
Моя проблема, конечно, происходит, но почти в случайные моменты времени; всегда ищет Keys
, он неожиданно начинает десериализацию Value
и при первом вызове B<C, M> ReadFrom(System.IO.Stream stream)
запрашивает TypeModel.CS
и ProtoReader.CS
файлов. Я получаю оба пакета от NuGet
.
запрашивает файл просто означает, что перехвачено исключение, и у вас есть отладочные символы; каково фактическое сообщение об исключении? –
@MarcGravell исключение: 'Неверное поле в исходных данных: 0' – Hamed
, что * обычно * означает, что фактические данные недействительны - каков более широкий контекст здесь? от чего вы сериализуете/десериализуете? –