2015-06-30 6 views
0

Так вот он идет,C# ошибка двоичная сериализация

У меня есть следующие JSON строку:

{"sTest":"Hello","oTest":{"vTest":{},iTest:0.0}} 

И я десериализации его, используя Newtonsoft.JSON как:

Dictionary<string, dynamic> obj = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json) 

Проблема в том, что у меня есть требование, которое требует, чтобы я сериализовал этот объект в двоичный файл, используя BinaryFormatter. И, выполнив следующие действия:

Stream stream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/_etc/") + "obj.dat", FileMode.Create, FileAccess.ReadWrite, FileShare.Read); 
BinaryFormatter serializer = new BinaryFormatter(); 
serializer.Serialize(stream, e.props); 
stream.Close(); 

Я получил сообщение об ошибке сказав:

Тип 'Newtonsoft.Json.Linq.JObject' в Newtonsoft.Json Ассамблеи», Version = 6.0.0.0, Culture = нейтральный, PublicKeyToken = xxxxxxxxxxxxxxx 'не помечен как сериализуемый.

Я понятия не имею, как продолжить. Есть что-то, что мне не хватает? Есть идеи? Благодаря!

ответ

3

Чтобы использовать BinaryFormatter, вам необходимо создать сериализуемые классы для соответствия данным в вашем JSON. Так, например:

// I'm hoping the real names are rather more useful - or you could use 
// Json.NET attributes to perform mapping. 
[Serializable] 
public class Foo 
{ 
    public string sTest { get; set; } 
    public Bar oTest { get; set; } 
} 

[Serializable] 
public class Bar 
{ 
    public List<string> vTest { get; set; } 
    public double iTest { get; set; } 
} 

Затем вы можете десериализации из JSON в Foo, а затем сериализации этот экземпляр.

+0

Это означает, что я не могу сериализовать динамический объект в двоичный файл? есть ли другая работа вокруг, которая позволяет мне это делать? В любом случае, большое спасибо, приятель! –

+1

@GalihDonoPrabowo: На самом деле нет такой вещи, как «динамический объект» - вы пытаетесь сериализовать «JObject». «BinaryFormatter» не знает, что ваша переменная использует «dynamic». Лично я бы рекомендовал попытаться избавиться от требования - бинарный форматтер .NET довольно хрупкий и раздражающий разными способами ... если ваше реальное требование - компактное представление, есть много других опций. (И «двоичный файл» не подразумевает «использование .NET бинарного serializatoin» обязательно ...) –

+0

Вероятно, маркировка класса с помощью ['[Serializable]'] (https://msdn.microsoft.com/en-us/ library/system.serializableattribute% 28v = vs.110% 29.aspx) будет проще, чем реализация ['ISerializable'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable % 28v = vs.110% 29.aspx). – dbc

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

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