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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top