Сериализация анонимных типов в Silverlight с помощью json.net - PullRequest
7 голосов
/ 12 июля 2011

У меня проблемы с сериализацией анонимного типа только на платформе Silverlight.У меня есть код на .net 4.0 и .netcf, который отлично работает.

Эта строка прямо здесь

Newtonsoft.Json.JsonConvert.SerializeObject(new { Something = "yup" });

бросает метко названного парня, JsonSerializationException:

Error getting value from 'Something' on '<>f__AnonymousType0`1[System.String]'.

Я пробовал 4.0r1 и 4.0r2 - я делаю что-то не так или я принимаю сумасшедшие таблетки?

Ответы [ 5 ]

8 голосов
/ 12 июля 2011

Проблема в том, что анонимные типы определяются компилятором как внутренние классы. JSON.NET полагается на работу отражения, а в Silverlight отражение через границы сборки работает только для открытых типов (при использовании частично доверенных сборок, таких как эта).

Я думаю, что DataContractJsonSerializer, как упомянуто в предыдущем ответе, является подходящим вариантом в этом случае, поскольку он является частью инфраструктуры и должен иметь дополнительные привилегии.

Еще одна вещь, которую стоит попробовать - использовать словари или ExpandoObject вместо анонимных типов, но YMMV.

5 голосов
/ 02 ноября 2013

Ответ прост;) Добавьте [Assembly: InternalsVisibleTo ("Newtonsoft.Json")] в AssemblyInfo.cs и вуаля ... У меня точно такая же проблема, и этот атрибут решил мою проблему сериализации / десериализации.

AssemblyInfo.cs

[assembly: InternalsVisibleTo("Newtonsoft.Json")] 
3 голосов
/ 12 июля 2011

Есть ли конкретная причина, по которой вы хотите использовать Json.NET? Если нет, вы можете попробовать встроенный сериализатор (в пространстве имен System.Runtime.Serialization). Я должен признать, я никогда не пробовал это с анонимными типами, поэтому я не уверен, будет ли это полезно для вас. В любом случае, вот класс, который я использую для сериализации / десериализации:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Text;
using System.Runtime.Serialization.Json;

namespace GLS.Gui.Helper
{
    public static class SerializationHelper
    {
        public static string SerializeToJsonString(object objectToSerialize)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType());
                serializer.WriteObject(ms, objectToSerialize);
                ms.Position = 0;

                using (StreamReader reader = new StreamReader(ms))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        public static T Deserialize<T>(string jsonString)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));

                return (T)serializer.ReadObject(ms);
            }
        }

    }
}
0 голосов
/ 21 июня 2012

Чтобы дополнить другие ответы другим обходным путем, обратите внимание, что отражение (и, следовательно, сериализация анонимных типов) будет успешным при работе с повышенным доверием.

0 голосов
/ 13 июля 2011

Возможно, посмотрите на это http://whydoidoit.com/silverlight-serializer/, поскольку я использовал это для сериализации многих объектов в Silverlight, хотя я не могу вспомнить, делал ли я анонимные типы с ним.

...