2010-02-10 8 views
1

Je ne suis pas familier avec Silverlight. Je travaille pour un projet qui dépend principalement de la sérialisation et de la désérialisation.Balises de groupe dépareillées détectées dans le message - protobuf-net

Auparavant, pour WPF, j'étais à l'aise avec les classes Serializable. Pour Silverlight, j'ai trouvé protobuf serait très utile. Mais, je suis troublé par cette exception. Je ne sais pas ce qui cause ce problème. Sil te plait aide moi. J'utilise Silverlight 3.0. protobuf-net r282

Veuillez trouver le code que j'utilise.

[ProtoContract] 
public class Report 
{ 
    public Report() 
    { 
    } 

    [ProtoMember(1)] 
    public SubReports SubReports { get; set; } 
} 

[ProtoContract] 
public class SubReports 
    : List<SubReport> 
{ 
    public SubReports() 
    { 
    } 

    [ProtoMember(1)] 
    public SubReport SubReport { get; set; } 
} 

[ProtoContract] 
public class SubReport 
{ 
    public SubReport() 
    { 
    } 

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

Le code que je suis à l'aide désérialiser est

public static T Deserialize<T>(Byte[] bytes) where T 
     : Report 
    { 
     return ProtoBuf.Serializer.Deserialize<T>(new MemoryStream(bytes)); 
    } 

Mon exemple XML ressemble à

Report 
    ...SubReports 
     ...SubReport Name=”Q1 Report” 
     ...SubReport Name=”Q2 Report” 
     ...SubReport Name=”Q3 Report” 
     ...SubReport Name=”Q4 Report”  

Merci à l'avance.
Vinodh

Répondre

1

(note: je ne pouvais pas reproduire le problème « balises groupe », voir modifier l'histoire pour mes premières réflexions à ce sujet, maintenant retiré, si vous pouvez me aider reproduis ce que je serais reconnaissant)

Le problème est SubReports. Vous avez défini ce à la fois sous la forme d'une liste et en tant qu'entité de sérialisation ([ProtoContract]); le dernier a la priorité, donc il essayait de sérialiser le sous-rapport simple sur la liste (qui est toujours null?).

Si vous changez ceci:

// note no attributes, no child property 
public class SubReports : List<SubReport> { } 

ou si vous supprimez complètement et de faire Report.SubReports un List<SubReport> il devrait fonctionner correctement. Les travaux suivants:

static void Main() { 
    byte[] blob; 
    // store a report 
    using (MemoryStream ms = new MemoryStream()) { 
     Report report = new Report { 
      SubReports = new List<SubReport> { 
       new SubReport { Name="Q1"}, 
       new SubReport { Name="Q2"}, 
       new SubReport { Name="Q3"}, 
       new SubReport { Name="Q4"}, 
      } 
     }; 

     Serializer.Serialize(ms, report); 
     blob = ms.ToArray(); 
    } 
    // show the hex 
    foreach (byte b in blob) { Console.Write(b.ToString("X2")); } 
    Console.WriteLine(); 

    // reload it 
    using (MemoryStream ms = new MemoryStream(blob)) { 
     Report report = Serializer.Deserialize<Report>(ms); 
     foreach (SubReport sub in report.SubReports) { 
      Console.WriteLine(sub.Name); 
     } 
    } 
} 

Affichage du blob:

0A040A0251310A040A0251320A040A0251330A040A025134

+0

Merci beaucoup marc pour la réponse rapide. Je vais regarder ça. –

+0

Salut Marc, votre dernière réponse elle-même résolu ma question. En fait, j'essayais de sérialiser un fichier xml et de remplir les classes comme [Serializable] ce que nous utilisons dans l'application Desktop. Et oui, j'ai "null" à "Sous-rapports" en utilisant la suggestion ci-dessus. Merci pour la mise à jour :) –