当前位置:  开发笔记 > Android > 正文

C#中的协议缓冲区:如何处理盒装值类型

如何解决《C#中的协议缓冲区:如何处理盒装值类型》经验,为你挑选了1个好方法。

在以下示例中:

public class RowData
{
    public object[] Values;
}

public class FieldData
{
    public object Value;
}

我很好奇protobuf-net或dotnet-protobufs如何处理这些类.我对protobuf-net比较熟悉,所以我实际拥有的是:

[ProtoContract]
public class RowData
{
    [ProtoMember(1)]
    public object[] Values;
}
[ProtoContract]
public class FieldData
{
    [ProtoMember(1)]
    public object Value;
}

但是我收到一条错误,上面写着"找不到合适的默认对象编码".是否有一种简单的方法来对待这些类,我只是不知道?

详细说明用例:

这是远程处理中使用的数据类的缩小版本.所以基本上它看起来像这样:

FieldData data = new FieldData();
data.Value = 8;

remoteObject.DoSomething(data);

注意:为简单起见,我省略了ISerializable实现,但它正如您所期望的那样.



1> Marc Gravell..:

Re protobuf-net,我维护:

这里的问题不是值类型(它通常可以正常处理) - 它是开放式object使用,这意味着它根本不知道期望什么数据,因此如何编码/解码它.

目前,我想不出一个简单/干净的方法来处理这个问题.它将处理一系列常见的值类型场景,列表以及基于契约(数据契约,原始契约或某些xml-schemas)的任何层次结构,但它需要一个线索.

也许如果你能澄清一下用例,我可能会帮助更多?例如,以上内容不适用于DataContractSerializer或者XmlSerializer......

Re dotnet-protobufs; 我无法评论,但我很确定它会更加宽容; 它旨在与.proto文件生成的类一起使用,因此object根本不会进入模型(Jon:如果我错了,请纠正我).

如果您确实留下了更多信息,请在这里发表评论吗?所以我可以很容易地找到它......或者,直接给我发邮件(参见我的SO资料).


编辑 - 这是我想到的hacky事情 - 它现在不起作用,但我会明白为什么明天(可能).请注意,理论上额外的成员都可以是私有的 - 我只是想在调试时轻松实现.请注意,这不需要任何额外的存储空间.就像我说的,它今天不起作用,但应该 - 我会找出原因......

[ProtoContract]
public class FieldData
{
    public object Value {get;set;}

    [ProtoMember(1)]
    public int ValueInt32 {
        get { return (int)Value; } set { Value = value; } }
    public bool ValueInt32Specified {
        get { return Value != null && Value is int; } set { } }

    [ProtoMember(2)]
    public float ValueSingle {
        get { return (float)Value; } set { Value = value; } }
    public bool ValueSingleSpecified {
        get { return Value != null && Value is float; } set { } }

    // etc for expected types
}

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有