Вопрос

У меня есть пользовательский абстрактный базовый класс с дополнительными классами, которые я сделал сериализуемым / дезернимируемым с помощью iserializable. Когда я делаю сериализацию / десериализацию единых экземпляров этого класса под классами, все работает нормально. Однако, когда я делаю массив из них, я всегда в конечном итоге с массивом ноль на десериализации. Сериализация выполняется с двоичным корреспондентом.

Предметы содержатся в пределах:

public ObservableCollection<Trade> Trades { get; private set; }

При сериализации это делается в getobjectdata на параметре serializzeinfo:

Trade[] trades = (Trade[])Trades.ToArray<Trade>();
            info.AddValue("trades", trades);

А по десериализации это делается в конструкторе сериализации также на параметре SerializationInfo:

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));

            foreach (Trade t in trades)
            {
                Trades.Add(t);
            }

Десериализация всегда дает мне массив ноль, и, как я упоминал ранее, единый предмет сериализуется и десериализируется просто в порядке с этим кодом:

Сериализация (метод getobjectData):

info.AddValue("trade", Trades.First<Trade>());

Дезерриализация (сериализация конструктор):

Trade t = (Trade)info.GetValue("trade", typeof(Trade));
            Trades.Add(t);

Это общая проблема? Кажется, я не нахожу никаких вхождений кого-либо, по крайней мере, бегая к нему. Надеюсь, есть решение :) И если мне нужно предоставить вам дополнительную информацию / код, просто скажи мне.

Спасибо!

Это было полезно?

Решение

Первое массив десериализируется. Тогда все внутренние десериализации сделано. Поэтому, когда вы пытаетесь получить доступ к элементам, они нуль.

И идея использовать [OnDeserialized] Атрибут на некоторых методах, который создает все остальные паста. А вот пример:

[Serializable]
public class TestClass : ISerializable
{
    private Trade[] _innerList;
    public ObservableCollection<Trade> List { get; set; }

    public TestClass()
    { }

    [OnDeserialized]
    private void SetValuesOnDeserialized(StreamingContext context)
    {
        this.List = new ObservableCollection<Trade>(_innerList);
        this._innerList = null;
    }

    protected TestClass(SerializationInfo info, StreamingContext context)
    {
        var value = info.GetValue("inner", typeof(Trade[]));
        this._innerList = (Trade[])value;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("inner", this.List.ToArray());
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top