views:

123

answers:

1

I’m quite new to Silverlight. I’m working for a project which mainly depends on Serialization and Deserialization.

Formerly, for WPF I was comfortable with Serializable classes. For silverlight, I found protobuf would be quite useful. But, I'm troubled with this exception. I don't know what causes this problem. Please help me out.

I'm using Silverlight 3.0. protobuf-net r282

Please find the code which I’m using.

[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; }
}

The Code I’m using to de-serialize is

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

My sample XML looks similar to

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

Thanks in advance.
Vinodh

+1  A: 

(note: I couldn't reproduce the "group tags" issue; see edit history for my first thoughts on this, now removed; if you can help me reproduce this I'd be grateful)

The problem is SubReports. You have defined this both as a list and as a serialization entity ([ProtoContract]); the latter takes precedence, so it was trying to serialize the single sub-report on the list (which is always null?).

If you change this to:

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

or if you remove it completely and make Report.SubReports a List<SubReport> it should work fine. The following works:

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);
        }
    }
}

Displaying the blob:

0A040A0251310A040A0251320A040A0251330A040A025134

Marc Gravell
Thanks a lot marc for the speedy response. I'll look into this.
Avatar
Hi Marc, your last answer itself resolved my question. Actually, I was trying de-serialize a xml file and fill the classes just like [Serializable] what we use in Desktop application.And Yes, I got "null" at "Subreports" by using the above suggestion.Thanks for the Update :)
Avatar