我使用的是找到的here的ComponentSerializationService:
当您从设计服务剪切控件时,将调用serialize方法;当您粘贴反序列化时,将调用serialize方法。
在我的例子中-我有一个简单的按钮,并且我改变了背景颜色。
Serialize看起来像这样:
public object Serialize(ICollection objects)
{
var serializationService = _serviceProvider.GetService(typeof(ComponentSerializationService)) as ComponentSerializationService;
if (serializationService == null)
{
throw new Exception("ComponentSerializationService not found");
}
SerializationStore returnObject;
using (var serializationStore = serializationService.CreateStore())
{
foreach (object obj in objects)
{
if (obj is Control)
{
serializationService.Serialize(serializationStore, obj);
}
}
returnObject = serializationStore;
}
return returnObject;
}反序列化看起来像这样:
public ICollection Deserialize(object serializationData)
{
var serializationStore = serializationData as SerializationStore;
if (serializationStore == null)
{
return new object[] {};
}
var componentSerializationService = _serviceProvider.GetService(typeof(ComponentSerializationService)) as ComponentSerializationService;
if (componentSerializationService == null)
{
throw new Exception("ComponentSerializationService not found");
}
var collection = componentSerializationService.Deserialize(serializationStore);
return collection;
}我在两个方法中都设置了断点,传入的对象包含正确的背景属性,但一旦反序列化,该属性就不会持久化。
欢迎任何想法。这是一个很棘手的类,只有很少的代码示例或文档。
发布于 2016-05-24 16:49:49
您应该看看这个,看看SerializeAbsolute是否适合您:)
更具体地说,我引用这句话
通过Serialize方法实现的
标准序列化只序列化与组件的默认状态不同的值。这提供了最紧凑的序列化机制,但假设在反序列化期间将使用新创建的对象。如果使用现有对象,则不能保证生成的反序列化对象会复制序列化对象的原始状态;序列化期间包含默认值的属性在反序列化期间不会重置回其默认值。SerializeAbsolute方法不使用此快捷方式。它序列化源对象的所有属性,以便反序列化可以恢复对象的所有属性,而不管默认状态如何。
https://stackoverflow.com/questions/35722234
复制相似问题