تم اكتشاف علامات المجموعة غير متطابقة في الرسالة - Protobuf-Net
-
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