我在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 - 我做错了什么还是我服用了疯狂的药片?
答案 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)
要使用其他解决方法补充其他答案,请注意在以提升的信任方式运行时,反射(以及匿名类型的序列化)将成功。