2016-11-09 8 views
0

Я хочу использовать MsgPack вместо Newtonsoft.JSON, поскольку он намного быстрее, но у меня есть проблема при попытке десериализовать список нулевых целых чисел.C# MsgPack бросает, когда распаковывает список нулевых целых чисел, содержащих NULL как элемент

Вот фрагмент кода, который я использую:

  public class MyClass 
      { 
       public MyClass() 
       { 
         MyCustomList = new List<int?>(); 
       } 
       public List<int?> MyCustomList { get; private set; } 
      } 


     MyClass source = new MyClass(); 
     source.MyCustomList.Add(1); 
     source.MyCustomList.Add(null); 

     var context = new SerializationContext {SerializationMethod = SerializationMethod.Map}; 
     context.DictionarySerlaizationOptions.OmitNullEntry = true; 

     //Create serializers 
     var serializer = SerializationContext.Default.GetSerializer<MyClass>(context); 
     var serializerDest = SerializationContext.Default.GetSerializer<MyClass>(context); 

     Stream stream = new MemoryStream(); 
     serializer.Pack(stream, source); 
     stream.Position = 0; 
     var unpackedObject = serializerDest.Unpack(stream); 

Последняя строка коды бросает исключение, как «{» распакованное значение не является «System.Int32» типа. Не конвертируйте nil MessagePackObject в System.Int32. "}"

Свойство My MyOustomList имеет тип List и не работает. Если я переключился на IList, это работает

Любая идея, если это известная ошибка? Как я могу избавиться от него?

Благодаря

+0

Вы можете включать в вашей реализации "MyClass", пожалуйста? –

+0

Я добавил реализацию класса. –

+0

У этого есть опечатка ошибка. context.DictionarySerlaizationOptions.OmitNullEntry = true; Кроме того, какую версию SerializationContext вы используете, потому что в vs2015 она выглядит совсем по-другому. Я думал, что запустим этот код и увижу вашу ошибку, но требуемая реализация vs2015 выглядит совсем по-другому:/поэтому я не могу дойти до точки, где вы получили свою ошибку. –

ответ

0

Я использую MsgPack версии 2.0.0-альфа 2 и она отлично работает. Единственное, что я сделал, это прокомментировать эту строку, потому что эта версия msgpack не распознала ее.

//context.DictionarySerializationOptions.OmitNullEntry = true;

enter image description here

using System.IO; 
//using Microsoft.VisualStudio.Modeling; 
using MsgPack.Serialization; 


namespace ConsoleApplicationTestCs 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

    MyClass source = new MyClass(); 
    source.MyCustomList.Add(1); 
    source.MyCustomList.Add(null); 

    var context = new SerializationContext { SerializationMethod = SerializationMethod.Map }; 

    //context.DictionarySerializationOptions.OmitNullEntry = true; 

    //Create serializers 
    var serializer = SerializationContext.Default.GetSerializer<MyClass>(context); 
    var serializerDest = SerializationContext.Default.GetSerializer<MyClass>(context); 

    Stream stream = new MemoryStream(); 
    serializer.Pack(stream, source); 
    stream.Position = 0; 
    var unpackedObject = serializerDest.Unpack(stream); 

} 


} 

public class MyClass 
{ 
    public MyClass() 
    { 
     MyCustomList = new List<int?>(); 
    } 
    public List<int?> MyCustomList { get; private set; } 
} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^