2

[ScriptIgnore] 属性は、シリアル化されている直接オブジェクトではうまく機能しますが、関連オブジェクトのプロパティ (直接オブジェクトのプロパティから参照される) に配置すると、適用されませんか?

つまりJson(ユーザー)

IE

class user {
 Badges badges
}

class Badge {

[ScriptIgnore]
SomeObject obj; //Causes circular reference error because scriptignore doesn't apply
}

これを回避する方法はありますか?

4

1 に答える 1

2

これを回避する方法はありますか?

必要なプロパティのみを公開するビュー モデルを使用し、そのビュー モデルを Json メソッドに渡すことをお勧めします。

私がお勧めするビューモデルのアプローチに従わない場合は、[ScriptIgnore]属性も機能するはずです。

例:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

public class User 
{
    public IEnumerable<Badge> Badges { get; set; }
}

public class Badge 
{
    [ScriptIgnore]
    public User User { get; set; }
}

public class Program
{
    static void Main()
    {
        var user = new User();
        var badge = new Badge { User = user };
        user.Badges = new[] { badge };

        var serializer = new JavaScriptSerializer();
        Console.WriteLine(serializer.Serialize(user));
    }
}

クラスのプロパティ[ScriptIgnore]から属性を削除すると、JSON のシリアル化は循環参照エラーのために失敗します。UserBadge

于 2012-08-19T06:14:34.023 に答える