Пользовательская сериализация класса холста - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть класс с некоторыми свойствами, которые я хочу сериализовать. Моя проблема в том, что я не могу сериализовать «CustomCanvasClass». Мне нужны только свойства X / Y. Поэтому я создал новое свойство и пометил свойство «CustomCanvasClass» как [NonSerialized].

К сожалению, оно не будет работать. Может быть, у кого-то есть другая идея скопировать эти данные из класса.

[Serializable]
public class CustomClass
{
    //won't serialized
    public double X
    {
        get
        {
            return Canvas.GetLeft(CustomCanvasClass);
        }

        set
        {
            Canvas.SetLeft(CustomCanvasClass, value);
        }
    }
    public string Property1 { get; set; }

    //CanvasElement inherits from Canvas. Serialization would throw a Exception.
    public CanvasElement CustomCanvasClass
    {
        get
        {
            return _CustomCanvasClass;
        }
        set
        {
            _CustomCanvasClass = value;
        }
    }

    [NonSerialized]
    private CanvasElement _CustomCanvasClass;
}

1 Ответ

0 голосов
/ 12 апреля 2020

Используйте DTO для нужных вам свойств и сериализуйте их.

DTO обозначает объект передачи данных. Он содержит данные, которые вы хотите передать, и без логики c.

Например, добавьте такой класс:

class MyCustomClassDto
{
    public double X {get;set;}
    public double Y {get;set;}
}

Так что вместо попытки сериализации вашего пользовательского класса напрямую, вы бы инициализируйте экземпляр этого значениями X и Y и сериализуйте его.

Затем в своем основном классе вы можете добавить это:

public MyCustomClassDto GetData()
{
    return new MyCustomerClassDto{X = X, Y = Y};
}

Вы также можете добавить метод сериализации в свой DTO .

В качестве альтернативы вы можете использовать инструмент отображения, такой как Autopper - который подойдет, если у вас есть много DTO или соответствующих объектов в разных слоях.

Надеюсь, что прояснит идею. Не вижу других способов расширения, не видя больше деталей / контекста.

Правильный подход mvvm itemspanel в комментарии к вопросу является предпочтительным, но это может потребовать существенного переписывания в зависимости от существующей кодовой базы. Возможно, вы захотите рассмотреть экономическое обоснование для такого рефакторинга imo, учитывая усилия, направленные против того, сколько еще может быть построено поверх него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...