StackOverflowException генерируется при сериализации циклически зависимого объекта ISerializable с ReferenceLoopHandling.Ignore

У меня есть устаревшее приложение, которое использовало двоичную сериализацию для сохранения данных. Теперь мы хотели использовать Json.net 4.5 для сериализации данных без особых изменений в существующих классах.

Все работало хорошо, пока мы не попали в круговой зависимый класс. Есть ли обходной путь для решения этой проблемы?

Пример кода, как показано ниже

[Serializable]
class Department : ISerializable
{
    public Employee Manager { get; set; }
    public string Name { get; set; }

    public Department() { }
    public Department( SerializationInfo info, StreamingContext context )
    {
        Manager = ( Employee )info.GetValue( "Manager", typeof( Employee ) );
        Name = ( string )info.GetValue( "Name", typeof( string ) );
    }
    public void GetObjectData( SerializationInfo info, StreamingContext context )
    {
        info.AddValue( "Manager", Manager );
        info.AddValue( "Name", Name );
    }
}

[Serializable]
class Employee : ISerializable
{
    [NonSerialized] //This does not work
    [XmlIgnore]//This does not work
    private Department mDepartment;
    public Department Department
    {
        get { return mDepartment; }
        set { mDepartment = value; }
    }

    public string Name { get; set; }

    public Employee() { }
    public Employee( SerializationInfo info, StreamingContext context )
    {
        Department = ( Department )info.GetValue( "Department", typeof( Department ) );
        Name = ( string )info.GetValue( "Name", typeof( string ) );
    }

    public void GetObjectData( SerializationInfo info, StreamingContext context )
    {
        info.AddValue( "Department", Department );
        info.AddValue( "Name", Name );
    }
}

И тестовый код

Department department = new Department();
department.Name = "Dept1";

Employee emp1 = new Employee { Name = "Emp1", Department = department };
department.Manager = emp1;

Employee emp2 = new Employee() { Name = "Emp2", Department = department };
IList employees = new List();
employees.Add( emp1 );
employees.Add( emp2 );

var memoryStream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize( memoryStream, employees );

memoryStream.Seek( 0, SeekOrigin.Begin );
IList deserialisedEmployees = formatter.Deserialize( memoryStream ) as IList; //Works nicely

JsonSerializerSettings jsonSS= new JsonSerializerSettings();
jsonSS.TypeNameHandling = TypeNameHandling.Objects;
jsonSS.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
jsonSS.Formatting = Formatting.Indented;
jsonSS.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //This is not working!!
//jsonSS.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; //This is also not working!!
jsonSS.PreserveReferencesHandling = PreserveReferencesHandling.All;
string jsonAll = JsonConvert.SerializeObject( employees, jsonSS ); //Throws stackoverflow exception

Edit1: Проблема была сообщена Json (http://json.codeplex.com/workitem/23668)

Edit2: Сериализация работает отлично в версии 4.5 R11, но десериализация все еще не работает

Edit3: На самом деле сама сериализация не работает, когда объект циклической ссылки не равен нулю

Edit4: Комментарий из базы вопросов Json.net состоит в том, что проблема на вашей стороне и закрыла проблему. Но я не смог выяснить, что не так с моим кодом. Я выложил другойвопрос в соответствии с этим. Спасибо всем за ответы, голосование ...

Ответы на вопрос(2)

Ваш ответ на вопрос