estoy tratando de reemplazar un serializador existente con protobuf para C# por Marc Gravell. Mi código es extenso y mi objetivo es poder hacer el cambio con cambios mínimos."un elemento con la misma clave ya ha sido añadido" error con protobuf-net
me encontré con un tema que creo entender por qué sucede, pero requieren ayuda para superar - en especial una solución que requieren menos cambios en mi código y clases ya existentes. Mi código es complejo por lo que creó el siguiente ejemplo corto para demostrar el problema:
using System;
using System.Collections.Generic;
using System.IO;
using ProtoBuf;
namespace ConsoleApplication1
{
class program_issue
{
[ProtoContract]
public class Father
{
public Father()
{
sonny = new Son();
}
[ProtoMember(101)]
public string Name;
[ProtoMember(102)]
public Son sonny;
}
[ProtoContract]
public class Son
{
public Son()
{
Dict.Add(10, "ten");
}
[ProtoMember(103)]
public Dictionary<int, string> Dict = new Dictionary<int, string>();
}
static void Main(string[] args)
{
Father f1 = new Father();
f1.Name = "Hello";
byte[] bts = PBSerializer.Serialize(typeof(Father), f1);
Father f2;
PBSerializer.Deserialize(bts, out f2);
}
public static class PBSerializer
{
public static byte[] Serialize(Type objType, object obj)
{
MemoryStream stream = new MemoryStream();
ProtoBuf.Serializer.Serialize(stream, obj);
string s = Convert.ToBase64String(stream.ToArray());
byte[] bytes = stream.ToArray();
return bytes;
}
public static void Deserialize(byte[] data, out Father obj)
{
using (MemoryStream stream = new MemoryStream(data))
{
obj = ProtoBuf.Serializer.Deserialize<Father>(stream);
}
}
}
}
}
En resumen, cuando se crea el objeto principal, se crea un objeto hijo, que INITs un diccionario con algunos valores. Supongo que cuando protobuf intenta reconstruir el objeto al deserializarlo usa el mismo constructor (iniciando así el diccionario con valores) y luego intenta volver a presionar los mismos valores como parte de la deserialización -> error.
¿Cómo puedo superar con mínimos cambios en mi código?
Saludos cordiales, Yossi.
nota menor: "protobuf-net" es sólo una aplicación; hay otras implementaciones de protobuf de C#. Solo menciono esto para explicar por qué cambié el título –