【问题标题】:Deserialization of an array always gives an array of nulls数组的反序列化总是给出一个空数组
【发布时间】:2010-12-02 20:37:11
【问题描述】:

我有一个带有子类的自定义抽象基类,我使用 ISerializable 将其序列化/反序列化。当我对此类的子类的单个实例进行序列化/反序列化时,一切正常。然而,当我做一个数组时,我总是在反序列化时得到一个空数组。序列化是使用 BinaryFormatter 完成的。

项目包含在一个:

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

在序列化时,这是在 SerializationInfo 参数的 GetObjectData 中完成的:

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

这是一个常见问题吗?至少我似乎没有发现任何其他人遇到它。希望有一个解决方案 :) 如果我需要为您提供更多信息/代码,请告诉我。

谢谢!

【问题讨论】:

  • 嗨,什么是信息变量?序列化的格式是什么? xml还是二进制?
  • 这是我在 GetObjectData 和 Serialization-constructor 中使用的 SerializationInfo,抱歉应该提到。
  • Trade[] trades = (Trade[])Trades.ToArray(); 的行是什么?你为什么不直接说 var trades = Trades.ToArray(); (Linq 扩展)
  • 政策:我正在做二进制序列化,所以我不认为我有这样的标签可用。

标签: c# arrays deserialization iserializable


【解决方案1】:

数组首先反序列化。然后完成所有内部反序列化。因此,当您尝试访问项目时,它们为空。

并且想法在某些方法上使用[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());
    }
}

【讨论】:

  • 我会尝试更多地研究它并在我的问题中提供更多代码。我实际上是在一个包含这个可序列化对象数组的类上进行序列化。一种替代方法是在 SerializationInfo 中用不同的名称序列化整个数组。 “trade1”等等。
  • 已更新答案,现在应该有所帮助)
  • 现在测试一下,请稍等。你太快了 :) 我什至没有完成我的新测试项目 :D
  • 严肃的俄罗斯程序员知道所有答案 :) 再次感谢!
  • @vesz 我只是喜欢你的问题)你问的时间很准:凌晨 2 点)
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多