首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在message - protobuf-net中检测到不匹配的组标签

在message - protobuf-net中检测到不匹配的组标签
EN

Stack Overflow用户
提问于 2010-02-10 19:00:17
回答 1查看 781关注 0票数 1

我是Silverlight的新手。我正在为一个主要依赖于序列化和反序列化的项目工作。

以前,对于WPF,我习惯使用Serializable类。对于silverlight,我发现protobuf非常有用。但是,我对这个例外感到困扰。我不知道是什么导致了这个问题。请帮帮我。

我使用的是Silverlight 3.0。protobuf-net r282

请找到我正在使用的代码。

代码语言:javascript
复制
[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; }
}

我用来反序列化的代码是

代码语言:javascript
复制
    public static T Deserialize<T>(Byte[] bytes) where T
        : Report
    {
        return ProtoBuf.Serializer.Deserialize<T>(new MemoryStream(bytes));
    }

我的示例XML看起来类似于

代码语言:javascript
复制
Report  
   ...SubReports  
      ...SubReport Name=”Q1 Report”   
      ...SubReport Name=”Q2 Report”   
      ...SubReport Name=”Q3 Report”   
      ...SubReport Name=”Q4 Report”     

提前谢谢。

维诺德

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-10 19:53:29

(注意:我无法复制“组标签”问题;请参阅编辑历史以了解我对此的第一个想法,现已删除;如果您能帮助我重现此问题,我将不胜感激)

问题出在SubReports上。您已经将其定义为一个列表和一个序列化实体([ProtoContract]);后者优先,因此它试图序列化列表上的单个子报告(始终为null?)。

如果将其更改为:

代码语言:javascript
复制
// note no attributes, no child property
public class SubReports : List<SubReport> { }

或者,如果您将其完全删除,并将Report.SubReports设置为List<SubReport>,则它应该可以正常工作。以下是工作原理:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2236226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档