【问题标题】:Recursive objects causing stackoverflow on StackService.Redis client method Store()在 Stack Service.Redis 客户端方法 Store() 中导致堆栈溢出的递归对象
【发布时间】:2012-08-08 08:36:15
【问题描述】:

我有两个 POCO 类(Account 和 Invoice),如您所见(下面是这些类的模型),它们是递归的。

当我传入带有帐户属性集的发票对象,然后尝试使用 redis 客户端存储它时,它会由于递归而导致堆栈溢出。下面是我如何拨打电话的示例。

CachingService.Store<Invoice>(invoiceObj);


public class CachingService {
    // ....
    public static void Store<T>(T obj)
    {
        using (var client = _redisClientsManager.GetClient())
        {   
            var typedClient = client.GetTypedClient<T>();
            typedClient.Store(obj);
        }
    }
}

我的 POCO 课程示例:

public class Account
{
    public string Name { set; get; }
    public bool IsActive { set; get; }

    public virtual ICollection<Invoice> Invoices { set; get; }
}

public class Invoice
{
    public bool IsPaid { set; get; }
    public DateTime? LastSent { set; get; }
    public int AccountId { set; get; }

    public virtual Account Account { set; get; }
}

【问题讨论】:

  • 我应该注意,当我将 ICollection 更改为 IEnumerable 时,问题就消失了。除了更改属性类型之外,也许还有一个实际解决此问题的方法。
  • 你能提供你用来创建这个递归的方法吗?我在你提供的代码中看不到它发生。
  • 好像是 Redis Serializer 问题。
  • 嗨 Simon,invoiceObj 包含一个 Account 对象。如果您真的需要一个代码 sn-p,我可以提供一个,但在此实例中,这就是 invoiceObj 中的全部内容。就像 Oleskii 说的,我也认为它是 Redis Seralizer。有没有办法标记序列化程序忽略的属性?

标签: c# asp.net-mvc-3 nosql redis servicestack


【解决方案1】:

大多数序列化程序(包括ServiceStack)不支持循环引用。这是设计 DTO 时的主要反模式。

要解决此问题,您需要告诉ServiceStack.Text's serializers 忽略该属性进行序列化,您可以使用 [IgnoreDataMember] 属性或将其更改为不是公共属性或将其更改为方法。

【讨论】:

  • [IgnoreDataMember] 是我正在寻找的属性。谢谢!
猜你喜欢
  • 2016-03-12
  • 2011-02-26
  • 1970-01-01
  • 2013-04-05
  • 2012-07-24
  • 2017-08-26
相关资源
最近更新 更多