étiquettes de groupe dépareillées détectés dans le message - protobuf-net
-
19-09-2019 - |
Question
Je suis tout à fait nouveau pour Silverlight. Je travaille pour un projet qui dépend principalement de sérialisation et désérialisation.
Autrefois, pour WPF j'étais à l'aise avec les classes sérializable. 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. S'il vous plaît, aidez-moi.
J'utilise Silverlight 3.0. r282 protobuf-net
S'il vous plaît trouver le code que je me sers.
[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 utilise pour 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
La solution
(Note: Je ne pouvais pas reproduire le problème « balises de 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 cette à la fois une liste et comme une entité sérialisation ([ProtoContract]
); celui-ci a la priorité, il a été de sérialisation à sous-rapport 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