Ошибка десериализации protobuf-net Неверный тег: 0 - PullRequest
0 голосов
/ 08 июня 2011

Я хочу сериализовать с использованием 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;}
}
}

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Вы используете TextReader для обработки нетекстового двоичного фрагмента. Это не будет работать; по сути, вы испортили двоичный файл, пытаясь UTF-декодировать что-то, что не было UTF, а затем перекодировали полученную (бессмысленную) строку.

Либо вернуть двоичный файл (например, байт []), либо, если он должен быть строкой: используйте base-64 через Convert.ToBase64String и т. Д.

Смотри также: http://marcgravell.blogspot.com/2010/03/binary-data-and-strings.html

0 голосов
/ 02 августа 2011

Я разместил аналогичный вопрос с protobuf-net здесь, и в ответе показано, как выполнить преобразование base64.

protobuf-net Сериализация в строку и сохранение в базе данных, затем де-сериализация

...