StackOverflowException в WCF с DataContractSerializer и IsReference = true - PullRequest
1 голос
/ 14 октября 2011

Мы разрабатываем приложение с использованием EF4 POCO и WCF 4.0.Мы используем DataContractSerializer и добавили IsReference=true.

Ленивая загрузка отключена, и приложение работало нормально, но теперь на некоторых экземплярах одного из объектов мы видим StackOverflowException.До этого у нас были циклические ссылки, и проблем не было.

Есть ли какие-либо советы о том, как действовать?

1 Ответ

0 голосов
/ 14 октября 2011

код для проверки проблем, связанных с атрибутом DataContract:

public class ObjectGraphValidator
{
    List<object> _knownObjects = new List<object>();
    Dictionary<Type, int> _encounteredCount = new Dictionary<Type, int>();
    List<Type> _nonReferenceTypes = new List<Type>();

    public void ValidateObjectGraph(object obj)
    {
        Type type = obj.GetType();
        if (_encounteredCount.ContainsKey(type))
            _encounteredCount[type]++;
        else
        {
            _encounteredCount.Add(type, 1);
            if (type.IsValueType)
                _nonReferenceTypes.Add(type);
            DataContractAttribute att = Attribute.GetCustomAttribute(type, typeof(DataContractAttribute)) as DataContractAttribute;
            if (att == null || !att.IsReference)
                _nonReferenceTypes.Add(type);
        }

        if (obj.GetType().IsValueType)
            return;
        if (_knownObjects.Contains(obj))
            return;
        _knownObjects.Add(obj);
        if (obj is IEnumerable)
            foreach (object obj2 in (obj as IEnumerable))
                ValidateObjectGraph(obj2);
        foreach (PropertyInfo property in type.GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic))
            if (property.GetIndexParameters().Count() == 0)
            {
                object value = property.GetValue(obj, null);
                if (value == null)
                    continue;
                ValidateObjectGraph(value);
            }
    }
}
...