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
Répondre
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).
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? –
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 –
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 ...) –
Essayez d'utiliser un substitut de sérialisation. Nice article par Jeff Richter
Nice Mécanisme. Merci pour le lien, c'est très intéressant –
- 1. .NET Read Binary File Performance
- 2. .Net sérialisation
- 3. Problème de sérialisation .NET
- 4. Problème de sérialisation .Net
- 5. Binary Serialized File - Delphi
- 6. Problème sérialisation Enum dans .NET
- 7. Sérialisation de System.Drawing.Color dans .NET
- 8. Xml Sérialisation dans .NET
- 9. sérialisation .NET types génériques
- 10. Sérialisation .NET dictionnaire
- 11. .net Sérialisation binaire - Opt In
- 12. sérialisation XML .NET en 2009
- 13. .NET Remoting - Sérialisation des délégués
- 14. sérialisation .NET et Caching question
- 15. Livre sur la sérialisation .Net?
- 16. Options de sérialisation XML dans .NET
- 17. Tutoriel de soumission Iphone Binary?
- 18. mysql force de comparaison BINARY
- 19. Implémentation de PHP Binary Tree
- 20. qt lrelease windows binary?
- 21. C# Winform Binary Icon
- 22. Standard ML Binary Tree
- 23. Decimal to Bit (Binary)
- 24. Binary Search Tree Questions
- 25. entier Binary Erlang
- 26. Emulation JQuery 'binary lock'
- 27. Erlang Binary Packet
- 28. Fat Binary sur Windows?
- 29. Sérialisation JSON très simple dans .NET
- 30. Sérialisation XML .Net basée sur un XSD?
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
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
A est une partie d'un autre projet sur lequel je n'ai aucun droit de modifier –