que intentó serializar una clase DynamicObject
con BinaryFormatter
, pero:serialización de objetos dinámicos
- archivo de salida es demasiado grande, no exactamente alambre de usar
- referencias circulares no se manejan (pegados al serializar)
Desde serializar un DynamicObject
significa muy poco a sí mismo, aquí está la clase I intentado serializar:
[Serializable()]
class Entity
: DynamicObject, ISerializable
{
IDictionary<string, object> values = new Dictionary<string, object>();
public Entity()
{
}
protected Entity(SerializationInfo info, StreamingContext ctx)
{
string fieldName = string.Empty;
object fieldValue = null;
foreach (var field in info)
{
fieldName = field.Name;
fieldValue = field.Value;
if (string.IsNullOrWhiteSpace(fieldName))
continue;
if (fieldValue == null)
continue;
this.values.Add(fieldName, fieldValue);
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
this.values.TryGetValue(binder.Name, out result);
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.values[binder.Name] = value;
return true;
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var kvp in this.values)
{
info.AddValue(kvp.Key, kvp.Value);
}
}
}
(supongo que podría haber utilizado un ExpandoObject, pero eso es otra historia).
Aquí es un simple programa de pruebas:
static void Main(string[] args)
{
BinaryFormatter binFmt = new BinaryFormatter();
dynamic obj = new Entity();
dynamic subObj = new Entity();
dynamic obj2 = null;
obj.Value = 100;
obj.Dictionary = new Dictionary<string, int>() { { "la la la", 1000 } };
subObj.Value = 200;
subObj.Name = "SubObject";
obj.Child = subObj;
using (var stream = new FileStream("test.txt", FileMode.OpenOrCreate))
{
binFmt.Serialize(stream, obj);
}
using (var stream = new FileStream("test.txt", FileMode.Open))
{
try
{
obj2 = binFmt.Deserialize(stream);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
Console.ReadLine();
}
poner algunos puntos de interrupción aquí y allá me ayudó a tener una mirada en obj2 contenidos y parece que los datos originales se deserializar correctamente, aunque con las limitaciones anteriores si se obtiene imaginativo y mover datos.
He echado un vistazo a la protobuf-net de Marc Gravell, pero no estoy muy seguro de cómo usarla en ese contexto (ni siquiera estoy seguro de haber elegido la versión correcta del repositorio, pero bueno) .
sé que es más código que las palabras, pero no creo que pueda explicar el escenario mejor. Dígame si hay algo que pueda agregar para aclarar esta pregunta.
Cualquier ayuda es muy apreciada.
Como referencia, * * protobuf-net no tiene soporte para 'dinámico'. Sugeriría pasar a una capa DTO para la serialización. –
@Marc - Gracias, investigaré eso. Todavía abierto a otras sugerencias también. – Raine
bueno, a largo plazo es algo que pienso apoyar en protobuf-net. Pero no puedo prometer nada en este momento. –