Как сериализовать UserControl?

Я пытаюсь сериализовать с помощью BinaryFormatter кастомный объект, который выглядит как то так:

[Serializable]
    public partial class DbTable : UserControl
    {
        public List<DbTable> Connections { get; set; }

        public List<DbTableItem> Attributes { get; set; }

        public string TableName { get; set; }
        public double X { get; set; }
        public double Y { get; set; }

        public DbTable(string tableName, List<DbTableItem> attrs, List<DbTable> connections, Point position)
        {
            ...
        }
        
        ...

    }


    [Serializable]
    public sealed class DbTableItem
    {
        ...
    }

но при попытке сериализации получаю следующее исключение:

System.Runtime.Serialization.SerializationException: 'Тип "System.Windows.Controls.UserControl" в сборке "PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" не помечен как сериализуемый.'

Нашел информацию, что это исключение возникает при наличии в объекте ссылок на объекты, не помеченные как сериализуемые, и что лучше для сериализации создать модель объекта по которой можно воссоздать его.

Но как создать модель объекта DbTable, если эта модель должна включать свойство Connections, которое содержит ссылку на другой объект DbTable?


Ответы (1 шт):

Автор решения: KindFrog

По рекомендации EvgeniyZ и aepot создал модель для DbTable, которую и сериализовывал.

Итоговый код:

    public partial class DbTable : UserControl
    {
        public DbTableData TableData { get; set; }

        public DbTable(DbTableData tableModel)
        {
            InitializeComponent();
            this.TableData = tableModel;
            
            ...

        }
    }

    [Serializable]
    public class DbTableData
    {
        public List<DbTableData> Connections { get; set; }

        public List<DbTableItem> Attributes { get; set; }

        public string TableName { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
    }

    [Serializable]
    public sealed class DbTableItem
    {
        ...


    }


→ Ссылка