В сообщении обнаружены несоответствующие групповые теги - protobuf-net - PullRequest
1 голос
/ 10 февраля 2010

Я довольно новичок в Silverlight. Я работаю над проектом, который в основном зависит от сериализации и десериализации.

Раньше для WPF мне было удобно работать с сериализуемыми классами. Для silverlight я нашел, что protobuf был бы весьма полезен. Но я обеспокоен этим исключением. Я не знаю, что вызывает эту проблему. Пожалуйста, помогите мне.

Я использую Silverlight 3.0. protobuf-net r282

Пожалуйста, найдите код, который я использую.

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

Код, который я использую для десериализации, -

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

Мой пример XML выглядит как

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

Заранее спасибо.
Vinodh

1 Ответ

1 голос
/ 10 февраля 2010

(примечание: я не смог воспроизвести проблему «групповых тегов»; см. Историю изменений для моих первых мыслей по этому поводу, теперь удален; если вы можете помочь мне воспроизвести это, я был бы благодарен)

Проблема в SubReports. Вы определили это и как список и как объект сериализации ([ProtoContract]); последний имеет приоритет, поэтому он пытался сериализовать в списке single подчиненный отчет (который всегда null?).

Если вы измените это на:

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

или если вы удалите его полностью и сделаете Report.SubReports a List<SubReport>, он должен работать нормально. Следующие работы:

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

Отображение BLOB-объекта:

0A040A0251310A040A0251320A040A0251330A040A025134

...