我正在使用找到here的
当您从设计服务中剪切控件时,将调用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;
}
Deserialize看起来像这样:
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;
}
我在两种方法中都设置了断点,并且传入的对象包含正确的背景属性,但是一旦反序列化,该属性就不会被持久化。
欢迎任何想法。这是一个棘手的类,代码示例或文档很少。
答案 0 :(得分:1)
你应该看看这个,看看SerializeAbsolute是否适合你:)
更具体地说,备注和我引用
标准序列化,通过Serialize方法实现, 仅序列化与组件的默认状态不同的值。 这提供了最紧凑的序列化机制,但假定 在反序列化期间将使用新创建的对象。如果 使用现有对象时,生成的反序列化对象不是 保证复制序列化对象的原始状态; 序列化期间包含默认值的属性将 在反序列化期间不能重置为默认值。该 SerializeAbsolute方法不使用此快捷方式。它序列化所有 源对象的属性,以便反序列化可以恢复 所有对象的属性,无论默认状态如何。