Десериализация массива всегда дает массив нулей - PullRequest
9 голосов
/ 02 декабря 2010

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

Элементы содержатся в:

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

При сериализации это выполняется в GetObjectData для параметра SerializationInfo:

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);

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

Спасибо!

1 Ответ

11 голосов
/ 02 декабря 2010

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

И идея использовать атрибут [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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...