Mar*_*arc 6 c# serialization json
我正在使用Sharepoint中的沙箱解决方案,由于使用了.net 3.5而且没有允许反射的重要限制(关于这个问题).
例1
如果我尝试将JSON字符串反序列化为这样的简单类,它可以正常工作:
JSON STRING
{"field":"Picture1","url":"whatever"}
Run Code Online (Sandbox Code Playgroud)
C#CLASS
public class PictureSetting
{
public string field { get; set; }
public string url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
例2
但是,如果我尝试反序列化更复杂的字符串,我会收到一个错误:
JSON STRING
{
"Rows": [
{
"Columns": [
{
"Width": "100"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
C#CLASSES
internal class PageStructure
{
public List<StructureElement> Rows { get; set; }
public PageStructure()
{
Rows = new List<StructureElement>();
}
}
internal class StructureElement
{
public List<BlockAssigment> Columns { get; set; }
public StructureElement()
{
Columns = new List<BlockAssigment>();
}
}
internal class BlockAssigment
{
public string Width { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误
请求类型'System.Security.Permissions.ReflectionPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的权限失败.
*DESERIALIZATION
我用于反序列化两个示例的代码只是标准的.net:
var serializer = new JavaScriptSerializer();
var obj = serializer.Deserialize<PageStructure>("jsonstring");
Run Code Online (Sandbox Code Playgroud)
所以似乎对于第一个例子.net 没有使用反射,因为它起作用.所以问题是:
有没有办法反序列化第二个例子而不使用.net在内部使用反射?
修改JSON字符串和C#类都没问题,我只需要以某种方式保持结构(包含列的行的基础对象).
我怀疑最大的问题其实就在这里:
public class PictureSetting // public, works
Run Code Online (Sandbox Code Playgroud)
相对
internal class PageStructure // non-public, permission denied
Run Code Online (Sandbox Code Playgroud)
在我看来,沙箱正在阻止非公共类型/成员的反射。这与大多数沙箱一致,例如 Silverlight:您可以使用反射,但只能用于正常情况下可以执行的操作 - 即访问公共类型/成员。尝试将PageStructure、StructureElement和BlockAssigment放入public类中。