ComponentSerializationService不反序列化所有属性

时间:2016-03-01 11:54:38

标签: c#

我正在使用找到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;
      }

我在两种方法中都设置了断点,并且传入的对象包含正确的背景属性,但是一旦反序列化,该属性就不会被持久化。

欢迎任何想法。这是一个棘手的类,代码示例或文档很少。

1 个答案:

答案 0 :(得分:1)

你应该看看这个,看看SerializeAbsolute是否适合你:)

https://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.componentserializationservice.serializeabsolute(v=vs.110).aspx

更具体地说,备注和我引用

  

标准序列化,通过Serialize方法实现,   仅序列化与组件的默认状态不同的值。   这提供了最紧凑的序列化机制,但假定   在反序列化期间将使用新创建的对象。如果   使用现有对象时,生成的反序列化对象不是   保证复制序列化对象的原始状态;   序列化期间包含默认值的属性将   在反序列化期间不能重置为默认值。该   SerializeAbsolute方法不使用此快捷方式。它序列化所有   源对象的属性,以便反序列化可以恢复   所有对象的属性,无论默认状态如何。