Ошибка при сериализации из-за циклической зависимости

У меня есть собственный базовый класс Entity украшен [DataContract(IsReference = true)] и исходя из UndoableBase CSLA.net. Сохранение IsReference важно для сохранения справочных данных объекта.

[Serializable]
[DataContract(IsReference = true)]
public abstract class Entity : UndoableBase

Я получаю исключение при сериализации, используя приведенный ниже фрагмент кода:

public void SerializeToFile(string fileName, T obj)
{
    _serializer = new DataContractSerializer(typeof(T));
    Serialize(fileName, obj);
}

private void Serialize(string fileName, T obj)
{
    using (var fs = File.Open(fileName, FileMode.Create))
    {
        _serializer.WriteObject(fs, obj);
        fs.Close();
    }
}

System.Runtime.Serialization.InvalidDataContractException

Параметр IsReference для типа "Entity" имеет значение "True", но тот же параметр для его родительского класса "Csla.Core.UndoableBase" имеет значение "False". Производные типы должны иметь то же значение для IsReference, что и базовый тип. Измените настройку для типа "Entity" на "False" или для типа "Csla.Core.UndoableBase" на "True", либо не устанавливайте IsReference явно.

Если я вообще удалю этот атрибут IsReference, я получу следующую ошибку:

Граф объектов для типа 'XYZ' содержит циклы и не может быть сериализован, если отслеживание ссылок отключено.

Теперь мой вопрос, как решить эту проблему, изменив IsReference установка для Csla.Core.UndoableBase во время сериализации с использованием некоторого API.

Исследуя эту тему, я наткнулся на этот пост, в котором говорится об использовании DataContractSurrogate, Пожалуйста, помогите, как использовать это, особенно, если это полезно в этом случае, или предложите любую другую технику, решающую это.

Как сериализовать класс, производный от класса, оформленного DataContract(IsReference=true)?

1 ответ

Решение

После долгой борьбы мне наконец удалось найти ответ на этот вопрос. Есть перегруженный конструктор, который принимает preserveObjectReferences флаг, чтобы дать указание сериализатору сохранить ссылки. В моем случае я сейчас удалил IsReference аннотации со всех концов и используемые ниже перегрузки для сериализации и жизни это хорошо.

var serializer = new DataContractSerializer(typeof(T), knownTypes,
            int.MaxValue /*maxObjectsInGraph*/,
            false /*ignoreExtensionDataObject*/,
            true /*preserveObjectReferences*/,
            null /*dataContractSurrogate*/);

Ссылка: Сохранение ссылки на объект в WCF

Другие вопросы по тегам