2011-08-17 4 views
2

Il est possible de sérialiser seulement quelques propriétés de la classe? ex:Protobuf-net - Sérialiser seulement quelques propriétés

public class Client 
{ 
    [ProtoMember(1)] 
    public int Id { get; set; } 

    [ProtoMember(2)] 
    public string Name { get; set; } 

    public int Age { get; set; } 

    [ProtoMember(3)] 
    public string Guid { get; set; } 
} 

Ainsi, je reçois la valeur incorrecte "Id". Les autres propriétés sont correctes. Si je le remplis avec "[ProtoMember]" toutes les propriétés, la valeur de "id" est correcte. Pourquoi?


En fait, l'erreur est due à d'autres raisons pour lesquelles vous pourriez m'aider.

Je convertis String en Stream pour effectuer des tâches. Dans le temps d'inverser cette conversion, j'ai erreur dans la valeur de Id


var cli = new Client 
{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"}; 

//Serialize 
var ms = new MemoryStream(); 
Serializer.Serialize(ms, cli); 
ms.Position = 0; 
var reader = new StreamReader(ms); 
var strStream = reader.ReadToEnd(); 

//Deserialize 
var ms2 = new MemoryStream(Encoding.UTF8.GetBytes(strStream)); 


var obj = Serializer.Deserialize<Client>(ms2); 

Ainsi, toute valeur supérieure à 127, est converti en un Int différent. Ex: 3104751

Ma conversion est incorrecte? Observez: Je suis désolé le pauvre anglais

+1

(je suis l'auteur de protobuf-net) la catégorie écrit est bien (tant que vous ajoutez '[ProtoContract]', comme suggéré par Alfonso). S'il vous plaît clarifier ce que vous entendez par "la valeur de" Id "incorrect" - que voyez-vous? –

+0

(ajouté une réponse à votre édition) –

Répondre

2

C'est. Assurez-vous simplement d'inclure l'attribut [ProtoContract] pour la classe et utilisez exactement le même contrat lors de la sérialisation et de la désérialisation.

+0

José, sans voir votre code, il sera impossible de vous aider. Collez une partie de votre code ici pour que les gens puissent voir ce que vous essayez de faire. Si votre question n'est pas liée à celle-ci, vous devriez en créer une autre pour éviter toute confusion. – alf

1

Le problème est dû au codage. Pourquoi lisez-vous le flux et en créez un autre? Quelque chose comme cela devrait fonctionner:

var cli = new Client{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"}; 

//Serialize 
var ms = new MemoryStream(); 
Serializer.Serialize(ms, cli); 
ms.Position = 0; 

//Deserialize 
var obj = Serializer.Deserialize<Client>(ms); 
+0

Étant donné que je convertis le flux en chaîne, String l'utilise dans certains processus, puis convertit l'objet pro en retour. –

+0

Vous devez envisager d'utiliser un flux et de ne pas le convertir en chaîne. Ils sont complets différents concepts.Cependant, je pense que vous pourriez résoudre votre problème en indiquant la codification UTF8 dans le constructeur StreamReader: new StreamReader (ms, System.Text.Encoding.UTF8) – alf

+0

J'ai testé ce code et l'erreur persiste. Je dois convertir en chaîne parce que je fais certaines opérations impliquant la base de données et d'autres règles métier. –

2

Avec votre édition, l'erreur est évidente; vous utilisez Encoding pour traiter des données arbitraires dans une chaîne. Ne vous inquiétez pas, je vois ce un lot (d'où this post).

L'intention d'un codage de texte est:

string  =>  byte[]  =>  string 
     (encode)   (decode) 

l'important ici est que le byte[] a une importance spécifique définie par le codage. Ce que vous voulez est base 64:

byte[]  =>  string  =>  byte[] 
     (encode)   (decode) 

que vous faire via:

byte[] raw = ms.ToArray(); 
string s = Convert.ToBase64String(raw); 

puis:

byte[] bytes = Convert.FromBase64String(s); 
Questions connexes