我有一个项目,我不能在我想要序列化的类型上使用序列化属性。一般来说,我可以这样做:
private byte[] Serialize(object value)
{
var type = value.GetType();
var typeModel = RuntimeTypeModel.Default.Add(type, false);
foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
typeModel.Add(prop.Name);
}
using (var stream = new MemoryStream())
{
try
{
Serializer.Serialize(stream, value);
return stream.ToArray();
}
catch (Exception ex)
{
throw;
}
}
}
但是,我有一种类型DynamicEntity
(见下文),这对于不会序列化的整个解决方案至关重要。我一直在研究它,但我想不出一种方法来让 RuntimeTypeModel 保存正确的序列化信息。相反,Serialize 不断抛出 InvalidCastException 消息
“无法将‘OpenNETCF.ORM.FieldValue’类型的对象转换为‘System.String’类型。”
以下是相关的类定义:
public class DynamicEntity
{
public DynamicEntity();
public string EntityName { get; set; }
public FieldCollection Fields { get; }
}
public class FieldCollection : IEnumerable<FieldValue>, IEnumerable
{
public int Count { get; }
public object this[string fieldName] { get; set; }
public void Add(string fieldName);
public void Add(string fieldName, object value);
public IEnumerator<FieldValue> GetEnumerator();
}
public class FieldValue
{
public string Name { get; }
public object Value { get; set; }
}
FieldValue 通常只保存简单的值——数据库字段可能保存的东西。我能够修改上述类的定义(即我拥有它们),但我不想强迫该类型的其他消费者反过来必须引用或使用 protobuf。