6

私はSharepointでサンドボックスソリューションに取り組んでいます。重要な制限(この質問に関して)は.net 3.5の使用であり、リフレクションは許可されていません。


例 1

このような単純なクラスに JSON 文字列として逆シリアル化しようとすると、正常に動作します。

JSON文字列

{"field":"Picture1","url":"whatever"}

C# クラス

public class PictureSetting
{
    public string field { get; set; }
    public string url { get; set; }
}

例 2

しかし、もう少し複雑な文字列を逆シリアル化しようとすると、エラーが発生します。

JSON文字列

{
  "Rows": [
    {
      "Columns": [
        {
          "Width": "100"
        }
      ]
    }    
  ]
}

C# クラス

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; }
}

エラー

タイプ 'System.Security.Permissions.ReflectionPermission、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。


*デシリアライゼーション

両方の例の逆シリアル化に使用するコードは、標準の .net です。

var serializer = new JavaScriptSerializer();
var obj = serializer.Deserialize<PageStructure>("jsonstring");

したがって、最初の例では、.net が機能するため、リフレクションを使用していないようです。質問は次のとおりです。

内部でリフレクションを使用する .net を使用せずに、2 番目の例を逆シリアル化する方法はありますか?

JSON 文字列と C# クラスの両方を変更しても問題ありません。構造 (列を含む行を含む基本オブジェクト) を保持する必要があるだけです。

4

2 に答える 2

3

最大の問題は実際にはここにあると思います:

public class PictureSetting // public, works

internal class PageStructure // non-public, permission denied

サンドボックスが非公開の型/メンバーの反映を妨げているように思えます。これは、Silverlight などのほとんどのサンドボックスと一致します。リフレクションを使用できますが、通常はできること、つまりパブリック タイプやメンバーにアクセスする場合に限られます。PageStructureStructureElementBlockAssigmentpublicクラスにしてみてください。

于 2012-08-14T06:37:37.277 に答える
-1

このサービスhttp://json2csharp.com/を使用して、json を解析するための正しい C# クラスを生成できます。

于 2012-08-14T06:55:35.963 に答える