Я попытался сериализовать класс DynamicObject
с BinaryFormatter
, но:
- Выходной файл слишком большой, не совсем совместим с проводом
- Циркулярные ссылки не обрабатываются (зависают при сериализации)
Поскольку сериализация DynamicObject
сама по себе очень мало значит, вот класс, который я пытался сериализовать:
[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);
}
}
}
(Думаю, я мог бы использовать ExpandoObject, но это уже другая история.)
Вот простая тестовая программа:
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();
}
Размещение некоторых точек останова здесь и там помогло мне взглянуть на содержимое obj2, и похоже, что исходные данные правильно десериализованы, хотя с указанными выше недостатками, если вы проявите изобретательность и перемещаете данные.
Я взглянул на protobuf-net Марка Гравелла, но я не совсем уверен, как использовать его в таком контексте (я даже не уверен, что взял правильную версию из репозитория, но эй).
Я знаю, что это больше кода, чем слов, но не думаю, что смогу объяснить сценарий лучше. Скажите, пожалуйста, есть ли что-то, что я могу добавить, чтобы прояснить этот вопрос.
Любая помощь горячо приветствуется.
dynamic
. Я бы предложил перейти на уровень DTO для сериализации. - person Marc Gravell   schedule 17.06.2010