2013-08-19 3 views
0

Communauté Dear Stack Overflow, Je pensais que je n'aurais jamais à poser cette question, mais apparemment, quelque chose ne va pas avec la sérialisation ou mon utilisation de celle-ci.Problème de sérialisation d'objet (C#)

J'ai une classe que je dois sérialisation:

[Serializable] 
public class Device : ISerializable, IDisposable 
{ 
    public delegate void ListChangedEventHandler(object sender, ListChangedEventArgs e); 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string IPAddress { get; set; } 

    [Browsable(false)] 
    public ThreadSafeBindingList<Item> Items { get; set; } 

    [Browsable(false)] 
    public MibEntity AssociatedMibEntity { get; set; } 

    //methods etc. 
} 

Une petite explication:

ThreadSafeBindingList est héritée de System.ComponentModel.BindingList MibEntity est une classe de bibliothèque SharpSNMP (http://sharpsnmplib.codeplex.com/)

Problème: Lorsque j'essaie t o désérialiser l'objet, MibEntity est toujours nul. D'autres propriétés sont bien. La classe MibEntity est dans une DLL externe, que je référence dans le projet où réside la classe Device.

C'est son contenu:

[Serializable] 
public class MibEntity 
{ 
    public MibEntity() 
    { 
     Children = new List<MibEntity>(); 
    } 

    [Browsable(false)] 
    public List<MibEntity> Children { get; set; } 

    [Browsable(true)] 
    [Category("General")] 
    public string OID { get; set; } 

    private string _name; 
    [Browsable(true)] 
    [Category("General")] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [Browsable(true)] 
    public string Description { get; set; } 

    [Browsable(false)] 
    public int Value { get; set; } 


    [Browsable(true)] 
    public AccessType AccessType { get; set; } //this is enum from SharpSNMP library 

    [Browsable(true)] 
    public Status Status { get; set; } //this is enum from same assembly as this class 

    [Browsable(true)] 
    public string Syntax { get; set; } 

    [Browsable(true)] 
    public bool IsTableEntry { get; set; } 

    [Browsable(true)] 
    public IDefinition IDefinition { get; set; } //this is interface from SharpSNMP library 
} 

J'utilise BinaryFormatter pour la sérialisation et la désérialisation. Nous vous remercions de votre aide!

+5

Puisque vous avez une sérialisation personnalisée via 'ISerializable', nous aurions besoin de voir à la fois la méthode' GetObjectData' personnalisée et le constructeur de désérialisation personnalisé. –

Répondre

3

Cela signifie invariablement que vous avez fait une erreur dans votre implémentation personnalisée ISerializable; les travaux suivants fins:

protected Device(SerializationInfo info, StreamingContext context) 
{ 
    Name = info.GetString("Name"); 
    //... 
    AssociatedMibEntity = (MibEntity)info.GetValue(
     "AssociatedMibEntity", typeof(MibEntity)); 
} 
void ISerializable.GetObjectData(
    SerializationInfo info, StreamingContext context) 
{ 
    info.AddValue("Name", Name); 
    //... 
    info.AddValue("AssociatedMibEntity", AssociatedMibEntity); 
} 

avec validation:

using (var ms = new MemoryStream()) 
{ 
    var bf = new BinaryFormatter(); 
    bf.Serialize(ms, new Device { 
     AssociatedMibEntity = new MibEntity { Name = "Foo"}}); 
    ms.Position = 0; 
    var clone = (Device)bf.Deserialize(ms); 
    Console.WriteLine(clone.AssociatedMibEntity.Name); // Foo 
} 

Cependant, à moins qu'il y ait une bonne raison de mettre en œuvre ISerializable, vous pourriez être mieux servis simplement enlever votre ISerializable mise en œuvre complètement - soulignez que ce sera un changement de rupture (toutes les données existantes ne seront pas désérialisées correctement si vous faites cela).

[Serializable] 
public class Device : IDisposable // <=== no ISerializable; also removed 
            // GetObjectData and custom .ctor 

aussi: ma diatribe habituelle: BinaryFormatter pourrait ne pas être votre meilleur pari si vous stockez ces données partout. C'est ... fragile. Il existe une gamme de sérialiseurs beaucoup plus fiables.