C# et .NET: Comment sérialiser une structure dans un byte[] tableau, à l'aide BinaryWriter?
Comment sérialiser un plutôt la complexité de la structure dans un byte[] tableau, à l'aide BinaryWriter?
Mise à jour:
- Pour ce faire, chaque structure (et de la sous-structure?) doit être décoré avec l'attribut [Serializable].
- Je n'ai pas besoin de mettre en œuvre l'interface ISerializable, comme c'est conçu pour donner un objet de contrôle sur sa propre sérialisation.
protobuf-net fonctionne parfaitement (voir la réponse ci-dessous). Fortement recommandé.
OriginalL'auteur Contango | 2011-09-16
Vous devez vous connecter pour publier un commentaire.
De commentaires, les OP du scénario nécessite une forte compatibilité avec les futures versions de l'application /.NET, dans ce cas, je conseille toujours againt
BinaryFormatter
- il a beaucoup de "caractéristiques" qui tout simplement ne fonctionnent pas bien entre les versions (et certainement pas entre les plates-formes).Je recommande à la recherche d'un contrat basé sur sérialiseurs; je suis partial, mais je me penche vers protobuf-net (dont les cartes de Google protobuf spécification). Le plus facile façon de le faire est d'attribuer les types de telle manière que la bibliothèque peut faire des travaux légers d'entre eux (même si on peut aussi le faire sans attributs), par exemple:
(l'attribut appoach est très bien si vous avez fait tout XmlSerializer ou DataContractSerializer travail - et en effet protobuf-net peut consommer les attributs de ces si vous ne voulez pas ajouter de protobuf-net attributs spécifiques)
alors quelque chose comme:
Les données produites de cette façon est indépendant de la plateforme, et peut être chargé sur toute correspondance contrat (il n'a même pas besoin d'être
Customer
- il pourrait à tout type de correspondance de mise en page via les attributs). En effet, dans la plupart des cas, il va charger facilement dans n'importe quel autre protobuf mise en œuvre en Java, C++, etc.Par ailleurs, j'ai juste intégré protobuf dans mon code, et il fonctionne à merveille. En regardant le code de base, c'est vraiment une belle oeuvre d'art. Je vous jure, je suis plus impressionné par vraiment élégant code que même le meilleur des exemples de compétences dans le Louvre.
vous êtes trop généreux, les internes ne sont pas particulièrement élégant (ils ne doivent être). Code de la bibliothèque accepte souvent un gros morceau-o'-laid, de sorte que l'appel de application code peut être propre. Voir ici pour plus d'
pour vain, mais se rapportent bien déprimant commentaire
ce à propos de la Version tolérance de la Sérialisation ? msdn.microsoft.com/en-us/library/ms229752(v=vs. 110).aspx
OriginalL'auteur
Utiliser le BinaryFormatter pour sérialiser un objet à un byte[]. BinaryWriter est juste pour écrire des octets d'un ruisseau.
notez que
BinaryFormatter
est étroitement couplée pour le type de modèle; - de l'OMI, il est adapté pour le transport entre .NET et .NET applications de la exact même version, mais dans beaucoup de problèmes en dehors de cette fenêtre étroite. La sérialisation est la réponse ici, mais il y a d'autres sérialiseurs qui se comportent beaucoup moins de mal que leBinaryFormatter
.re
ToArray()
, changement deusing (MemoryStream stream = ...
Désolé mise à jour, le type de flux de MemoryStream.
parce qu'il est étroitement lié aux types (plutôt que d'un schéma abstrait), il a une longue histoire d'être fragile quand les gens évoluer leurs modèles - à peu près n'importe quel genre de refactoriser (renommer, déplacer, modifier les propriétés automatiquement mises en oeuvre-propriétés, signe de votre assemblée, le changement de nom de la société et donc de l'assemblée, etc) peut causer d'énormes problèmes. Puis, il y a des choses comme il n'existe pas dans CoreCLR (et une gamme d'autres environnements d'exécution). J'ai perdu le compte du nombre de "au secours, j'ai utilisé BinaryFormatter et maintenant je ne peux pas charger mes données" questions j'ai participé. Trop nombreux.
OriginalL'auteur
extrait de code.
mise à jour de la réponse, vous pourriez trouver comment désérialiser.
OriginalL'auteur