تم اكتشاف علامات المجموعة غير متطابقة في الرسالة - Protobuf-Net

StackOverflow https://stackoverflow.com/questions/2236226

  •  19-09-2019
  •  | 
  •  

سؤال

أنا جديد جدا على 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”     

شكرا مقدما.
فينوده

هل كانت مفيدة؟

المحلول

(ملاحظة: لم أستطع إعادة إنتاج مشكلة "علامات المجموعة"؛ راجع تحرير التاريخ لأفكاري الأولى حول هذا، تتم إزالة الآن؛ إذا كنت تستطيع مساعدتي في إعادة إنتاج هذا سأكون ممتنا)

المشكلة هي SubReports. وبعد لقد حددت هذا على حد سواء كقائمة و ككيان التسلسل ([ProtoContract]) هذا الأخير يأخذ الأسبقية، لذلك كان يحاول تسلسل غير مرتبطة تقرير الفرعية على القائمة (وهو دائما null?).

إذا قمت بتغيير هذا إلى:

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

أو إذا قمت بإزالته بالكامل وجعل Report.SubReports أ 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top