Question

J'ai une classe de base abstraite personnalisée avec des classes de sous que je l'ai fait sérialisable / deseriablizeable avec ISerializable. Quand je fais sérialisation / désérialisation des instances uniques des sous classes de cette classe, tout fonctionne bien. Cependant, quand je fais un tableau d'eux, je finis toujours avec un tableau de valeurs nulles sur désérialisation. Sérialisation est fait avec BinaryFormatter.

Les éléments sont contenus dans un:

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

Sur sérialisation cela se fait dans GetObjectData sur le paramètre SerializationInfo:

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

Et désérialisation cela se fait dans le constructeur de sérialisation également sur le paramètre SerializationInfo:

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

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

Désérialisation me donne toujours un tableau de valeurs nulles et comme je l'ai mentionné plus tôt, un sérialisés unique de l'objet et deseriaizes très bien avec ce code:

sérialisation (méthode GetObjectData):

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

désérialisation (sérialisation Constructor):

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

Est-ce un problème commun? Il me semble trouver aucune occurrence de quelqu'un d'autre dans la course à au moins. Espérons qu'il y ait une solution :) et si je dois vous fournir plus d'informations / code juste me dire.

Merci!

Était-ce utile?

La solution

Tableau désérialise premier. Ensuite, tout désérialisation intérieur est fait. Donc, lorsque vous essayez d'accéder à des éléments, ils sont nuls.

idée d'utiliser [OnDeserialized] attributs sur une méthode, qui accumule tous les autres properies. Et est par exemple ici:

[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());
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top