2009-11-04 3 views
3

Disons que j'ai des objets de domaine qui devront être sérialisés/empaquetés en utilisant un format binaire personnalisé afin qu'ils puissent être envoyés via des sockets à des processus externes. Mon premier instinct serait de créer une interface qui représente n'importe quel objet qui peut être emballé dans ce format binaire.Classe: Sérialiser dans un objet de domaine ou une classe auxiliaire

public interface IPackable 
{ 
    byte[] Pack(); 
} 

Ensuite, mes objets de domaine (tels que Entity, State, Vector, etc.) seraient chacun implémenter cette interface. Ceci est similaire à la façon dont la sérialisation par défaut fonctionne dans .NET et Java.

public class Vector : IPackable 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
    public double Z { get; set; } 

    // other operators and methods... 

    public byte[] Pack 
    { 
    MemoryStream stream = new MemoryStream(); 
    BinaryWriter writer = new BinaryWriter(stream); 

    writer.Write(X); 
    writer.Write(Y); 
    writer.Write(Z); 

    return stream.ToArray(); 
} 

Cependant, plus j'apprends sur les principes de conception (comme le SOLID's Single Responsibility Principle), plus je pense que je devrais créer une catégorie distincte pour emballer mes objets de domaine.

Je peux voir les avantages et les inconvénients des deux. Qu'est-ce que vous en pensez tous? Si la réponse est créer une classe distincte pour l'emballage des objets de domaine, dois-je créer un packer distinct pour chaque objet de domaine (tel que EntityPacker, StatePacker, VectorPacker, etc.)?

Merci

+1

Je ne pense pas qu'il y ait une réponse concluante à cette question, faire une recherche sur "Smart Objects, Dumb Archives" vs "Objets Dumb, Smart Archives" - c'est le même dilemme. –

Répondre

1

Avez-vous également considéré comme l'espace de noms System.Runtime.Serialization?

Le problème avec la création d'un sérialiseur externe est que vous devez ouvrir toutes vos données intéressantes à un autre objet. Étant donné que la plus grande partie de l'état de votre objet est susceptible d'être détenu dans des variables privées, les propriétés exposées d'un objet ne fournissent pas nécessairement suffisamment d'informations pour le décrire complètement en externe. En accord avec une bonne encapsulation de données, je préférerais cacher les détails de l'empaquetage/sérialisation dans l'objet stocké.

+0

Je pensais que le sérialiseur .NET par défaut ne sérialisait que les propriétés/champs publics. Alors, cela serait-il différent? – dewald

+0

Désolé, j'ai manqué votre commentaire d'avant ... Vous pouvez entièrement contrôler la sérialisation d'un objet en utilisant l'interface ISerializable. – jheddings

1

Il existe plusieurs formes de sérialisation intégrées au framework .NET que vous pouvez utiliser à cette fin. Les exemples sont SOAP, XML mais aussi binaires, ce qui se prête bien à l'envoi d'objets sur des flux de toutes sortes, y compris les flux réseau.

La sérialisation binaire dans .NET est également capable de sérialiser et de désérialiser des propriétés et des champs privés, contrairement à la construction dans les formats XML et SOAP. Cependant, vous devez être sûr que lorsque vous utilisez le formateur binaire, il est uniquement compatible avec la bibliothèque .NET, alors que SOAP peut être lu à partir de n'importe quelle plate-forme compatible SOAP.

Questions connexes