protobuf-net 反序列化错误 无效标签:0

Posted

技术标签:

【中文标题】protobuf-net 反序列化错误 无效标签:0【英文标题】:protobuf-net deserializing error Invalid tag: 0 【发布时间】:2011-06-08 15:39:35 【问题描述】:

我想使用 protobuf-net 序列化字符串并反序列化回对象。如果我序列化到像 .bin 这样的文件,它工作正常但是下面的代码在反序列化时会引发异常。有什么想法吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using ProtoBuf;

namespace Proto

class Program

    public long MemUsed = 0;
    NetDataContractSerializer ser = new NetDataContractSerializer();

    static void Main(string[] args)
    
        var person = new Person 
            Id = 12345, Name = "Fred",
            Address = new Address 
            
                Line1 = "Flat 1",
                Line2 = "The Meadows"
            
        ;
        Console.WriteLine("Serializing .....");
        var result = Serialize<Person>(person);
        Console.WriteLine(" Serialization Complete .....");
        Console.WriteLine("Press key to Deserialize ....");
        Console.ReadKey();
        var person2 = new Person();
        DeSerialize<Person>(ref person2,result);
        Console.WriteLine(person2.Name);
        Console.ReadLine();
    

    public static string Serialize<T>(T myObj)
    
        string retVal = "";            
        using (MemoryStream memStream = new MemoryStream())
        
            Serializer.Serialize<T>(memStream, myObj);
            memStream.Position = 0;
            retVal = new StreamReader(memStream).ReadToEnd();
        
        return (retVal);          
    

    public static void DeSerialize<T>(ref T myObj, string xmlString)
    
        byte[] byteArray = Encoding.ASCII.GetBytes(xmlString); 
        MemoryStream stream = new MemoryStream(byteArray,0,byteArray.Length);
        stream.Capacity = Convert.ToInt32(stream.Length);
        myObj = Serializer.Deserialize<T>(stream);
        stream.Close();       
    


[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;


【问题讨论】:

参数“xmlString”特别容易误导——这肯定不是 XML :p 【参考方案1】:

您正在使用 TextReader 处理非文本二进制块。这行不通;本质上,您通过尝试对不是 UTF 的内容进行 UTF 解码,然后重新编码您获得的(无意义的)字符串来破坏二进制文件。

返回二进制文件(例如一个字节[]),或者如果它必须是字符串:通过 Convert.ToBase64String 等使用 base-64。

另请参阅:http://marcgravell.blogspot.com/2010/03/binary-data-and-strings.html

【讨论】:

【参考方案2】:

我在这里发布了一个与 protobuf-net 类似的问题,答案向您展示了如何进行 base64 转换。

protobuf-net Serialize To String and Store in Database Then De Serialize

【讨论】:

以上是关于protobuf-net 反序列化错误 无效标签:0的主要内容,如果未能解决你的问题,请参考以下文章

ProtoBuf-Net 错误消息“源数据中的无效字段:0”

Protobuf-net 使用嵌套数据反序列化时出现无效的线型异常(C++ 到 C#)

protobuf-net:反序列化 Guid 属性的错误线型异常

Protobuf-net“反序列化期间引用跟踪对象更改引用”错误(2)

如何修复 c# protobuf-net 中的无效线型问题

protobuf-net:不正确的线型反序列化 TimeSpan