2009-12-16 3 views
1

Dans un contexte C#, j'ai une classe B qui est marquée comme sérialisable et qui hérite d'une classe A qui n'est pas marquée comme ceci. Puis-je trouver un moyen de sérialiser l'instance de B sans marquer A comme sérialisable?.Net Binary Sérialisation de l'héritage

+0

Je pense que vous avez juste besoin d'implémenter iSerializable en classe B, cela vous permettra de contrôler la sérialisation de la classe. – Lazarus

+0

Si vous voulez sérialiser B, vous devrez aussi sérialiser l'état de sa superclasse A. Pourquoi ne voulez-vous pas marquer A comme sérialisable? – Onots

+0

A est une partie d'un autre projet sur lequel je n'ai aucun droit de modifier –

Répondre

0

Je pense que si vous faites série personnalisée cela devrait fonctionner - c'est-à-dire mettre en œuvre ISerializable. Pas une bonne option, cependant:

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
class A { 
    public int Foo { get; set; } 
} 
[Serializable] 
class B : A, ISerializable { 
    public string Bar { get; set; } 
    public B() { } 

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
     info.AddValue("Foo", Foo); 
     info.AddValue("Bar", Bar); 
    } 
    private B(SerializationInfo info, StreamingContext context) { 
     Foo = info.GetInt32("Foo"); 
     Bar = info.GetString("Bar"); 
    }  
} 
static class Program { 
    static void Main() { 
     BinaryFormatter bf = new BinaryFormatter(); 
     B b = new B { Foo = 123, Bar = "abc" }, clone; 
     using (MemoryStream ms = new MemoryStream()) { 
      bf.Serialize(ms, b); 
      ms.Position = 0; 
      clone = (B)bf.Deserialize(ms); 
     } 
     Console.WriteLine(clone.Foo); 
     Console.WriteLine(clone.Bar); 
    } 
} 

Voulez-vous juste stocker les données? Je peux aussi penser à un moyen de le faire en utilisant protobuf-net (plutôt que BinaryFormatter, que je suppose que vous utilisez).

+0

Merci pour votre réponse. Oui, exactement, j'utilise BynaryFormatter. Le besoin est de stocker les données de l'objet. A propos de protobuf-net, quels sont les avantages de l'utiliser à la place de BinaryFormatter? Y a-t-il des exemples? –

+0

a: plus rapide et plus petit (http://code.google.com/p/protobuf-net/wiki/Performance) b: indépendant de la plateforme/de la langue (http://code.google.com/p/protobuf/wiki/ ThirdPartyAddOns) c: pas de métadonnées spécifiques (peut renommer les champs, déplacer/renommer les types, etc: http://marcgravell.blogspot.com/2009/03/obfuscation-serialization-and.html). Brève introduction: http://code.google.com/p/protobuf-net/wiki/GettingStarted –

+0

Notez que l'intro ne couvre pas l'héritage, et le support de l'héritage dans protobuf-net est une personnalisation et ne sera pas mappé * directement * à Java/C++/etc: ils verront les données, mais pas en tant qu'héritage (hé, je n'ai pas conçu le format de fil ...) –

1

Essayez d'utiliser un substitut de sérialisation. Nice article par Jeff Richter

+0

Nice Mécanisme. Merci pour le lien, c'est très intéressant –