2

次のようなラップされたリストがあります。

[Serializable]
public class OrderManager : IEnumerable<Order>
{
    public OrderManager()
    { }

    private List<Order> orders = new List<Order>();

    public void AddOrder(Order order)
    {
        orders.Add(order);
    }

    public IEnumerator<Order> GetEnumerator()
    {
        return orders.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return orders.GetEnumerator();
    }
}

次のように、顧客クラスにフィールド インスタンスを含めます。

[Serializable]
public class Customer
{
    public Customer()
    { }

    private OrderManager _orders
        = new OrderManager();
    public OrderManager Orders
    {
        get { return _orders; }
        set { _orders = value; }
    }
}

次のように JSON.NET シリアライザーを作成します。

private JsonSerializer GetSerializer()
{
    var serializer = new JsonSerializer();

    // on or off the type name handling doesn't help
    //serializer.TypeNameHandling = TypeNameHandling.All;

    var contractResolver = new DefaultContractResolver(true);
    contractResolver.IgnoreSerializableAttribute = false;
    contractResolver.IgnoreSerializableInterface = false;

    serializer.ContractResolver = contractResolver;

    serializer.PreserveReferencesHandling = PreserveReferencesHandling.All;
    serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

    return serializer;          
}

顧客オブジェクトのシリアル化は機能しますが、逆シリアル化中に次のエラーが発生します。

「Tests.SerializationTests+Customer」で値を「_orders」に設定中にエラーが発生しました。

TypeNameHandling を All に設定すると、次のようになります。

Type specified in JSON 'Tests.SerializationTests+Order[], Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not compatible with 'Tests.SerializationTests+OrderManager, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Path '_orders.$type', line 1, position 232.

ラップされたリストで Json.NET をうまく機能させる方法はありますか?

4

3 に答える 3

1

実装する必要があると思いますICollection<Order>

public class OrderManager : IEnumerable<Order>,ICollection<Order>

-

[Serializable]
public class OrderManager : IEnumerable<Order>,ICollection<Order>
{
    public OrderManager()
    { }

    private List<Order> orders = new List<Order>();

    public Order this[int i]
    {
        set { AddOrder(value); }
        get { return orders[i]; }
    }

    public void AddOrder(Order order)
    {
        orders.Add(order);
    }

    public IEnumerator<Order> GetEnumerator()
    {
        return orders.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return orders.GetEnumerator();
    }

    public void Add(Order item)
    {
        AddOrder(item);
    }

    public void Clear()
    {
        orders.Clear();
    }

    public bool Contains(Order item)
    {
        return orders.Contains(item);
    }

    public void CopyTo(Order[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public int Count
    {
        get { return orders.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(Order item)
    {
        return orders.Remove(item);
    }
}
于 2012-05-07T20:21:28.420 に答える
0

次の 2 つのいずれかを試してください。

OrderCollection という List のラッパー コレクション クラスを作成します。

[Serializable]/[DataContract]
public OrderCollection : List<Order> { ... }

または、LIST を ARRAY に変換してみてください。

いずれかがどのように機能するかをお知らせください。

于 2012-05-07T20:15:33.530 に答える
0

シリアル化が IEnumerable で機能するかどうかわかりませんが、List で試していただけますか?

[Serializable]
public class OrderManager : List<Order>
于 2012-05-07T20:16:23.383 に答える