【问题标题】:Getting started with protobuf-net开始使用 protobuf-net
【发布时间】:2013-01-10 05:59:24
【问题描述】:

我正在尝试开始使用 protobuf.net。

我已经从here 下载了最新版本,实现了[ProtoContract] 类,现在我正在尝试使用ProtoBuf.Serializer.Serialize 对其进行序列化,如documentation 中所述。问题是,没有这样的方法。

如何将[ProtoContract] 写入磁盘?

更新 显然,我的版本有误,但这是我的 Serialize 类的样子:

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    这必须帮助您开始使用它:Source & Credit & Marc Gravell


    最简单的入门方法就是编写数据:

    class Person {
        public int Id {get;set;}
        public string Name {get;set;}
        public Address Address {get;set;}
    }
    class Address {
        public string Line1 {get;set;}
        public string Line2 {get;set;}
    }
    

    这是一个好的开始,但仅靠 protobuf-net 是不够的。与 XmlSerializer 不同,成员名称未在数据中编码 - 相反,您必须选择一个整数来标识每个成员。此外,为了表明意图,有必要表明我们打算将此类型序列化(即它是一个数据协定):

    [ProtoContract]
    class Person {
        [ProtoMember(1)]
        public int Id {get;set;}
        [ProtoMember(2)]
        public string Name {get;set;}
        [ProtoMember(3)]
        public Address Address {get;set;}
    }
    [ProtoContract]
    class Address {
        [ProtoMember(1)]
        public string Line1 {get;set;}
        [ProtoMember(2)]
        public string Line2 {get;set;}
    }
    

    由于“protocol buffers”是一种二进制格式,protobuf-net 主要基于 Stream 类;这使得使用各种实现变得简单。例如,写入文件:

    var person = new Person {
        Id = 12345, Name = "Fred",
        Address = new Address {
            Line1 = "Flat 1",
            Line2 = "The Meadows"
        }
    };
    using (var file = File.Create("person.bin")) {
        Serializer.Serialize(file, person);
    }
    

    这会将一个 32 字节的文件写入“person.bin”。在上面可能并不明显,但 Serialize 是一种通用方法 - 该行也可以是:

    using (var file = File.Create("person.bin")) {
        Serializer.Serialize<Person>(file, person);
    }
    

    但大多数时候我们可以让编译器的泛型类型推断为我们完成工作。 反序列化数据

    我们还需要找回数据!

    Person newPerson;
    using (var file = File.OpenRead("person.bin")) {
        newPerson = Serializer.Deserialize<Person>(file);
    }
    

    这会从“person.bin”中读回数据。注意我们这次需要告诉它类型(the ),否则代码非常相似。


    更新:Download this package

    【讨论】:

    • 这个库是 v1 还是 v2?
    • r282 只是最终的 v1 版本;这里的答案不仅仅是“使用 r282”——如果使用得当,以后的构建就可以正常工作。
    • 我必须使用文件吗?如果序列化成字符串呢?
    【解决方案2】:

    听起来您已经选择了“CoreOnly”构建,可能适用于 iOS 或 Unity?这意味着您正在使用 google-code 下载。该软件包的根目录中有一个“我需要什么文件.txt”,它解释了不同构建的用途。您可能应该使用“完整”构建。或者更简单地说,使用仅包含“完整”构建的 NuGet 部署。

    如果您想使用“CoreOnly”,您可能应该使用单独的“预编译”工具来生成自定义序列化程序,然后:

     var ser = new MyCustomSerializer();
     ser.Serialize(...);
    

    此方案主要用于 Windows Phone、Silverlight、iOS 等轻型框架 - 其中元编程/反射要么非常有限,要么完全不允许。

    【讨论】:

    • full/net20 文件夹拖入“资产”在Unity 2021.2.3f1 上工作得很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多