使用json.net在Silverlight中序列化匿名类型

时间:2011-07-12 08:01:37

标签: silverlight json.net anonymous-types

我在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 个答案:

答案 0 :(得分:8)

问题是编译器将匿名类型定义为内部类。 JSON.NET依赖于反射来工作,并且在Silverlight中,跨程序集边界的反射仅适用于公共类型(当由部分受信任的程序集(例如此程序集)使用时)。

我认为上一个答案中提到的DataContractJsonSerializer是这种情况下的方法,因为它是框架的一部分,应该有额外的权限。

要尝试的另一件事是使用字典或ExpandoObject而不是匿名类型,但使用YMMV。

答案 1 :(得分:5)

答案很简单;)将[assembly:InternalsVisibleTo(“Newtonsoft.Json”)]添加到AssemblyInfo.cs并瞧...我有完全相同的问题,这个属性解决了我的序列化/反序列化问题。

的AssemblyInfo.cs

[assembly: InternalsVisibleTo("Newtonsoft.Json")] 

答案 2 :(得分:3)

您是否有特定原因要使用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);
            }
        }

    }
}

答案 3 :(得分:0)

也许看一下这个http://whydoidoit.com/silverlight-serializer/,因为我用它来序列化Silverlight中的很多对象,虽然我不记得我是否用它做了匿名类型。

答案 4 :(得分:0)

要使用其他解决方法补充其他答案,请注意在以提升的信任方式运行时,反射(以及匿名类型的序列化)将成功。