组件序列化服务不反序列化所有属性

本文关键字:属性 反序列化 序列化 服务 组件 | 更新日期: 2023-09-27 18:36:48

我正在使用ComponentSerializationService,如下所示:

从设计服务剪切控件时,将调用序列化方法,粘贴反序列化时将调用该方法。

在我的示例中 - 我有一个简单的按钮,我已经更改了背景颜色。

序列化看起来像这样:

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;
      }

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

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

组件序列化服务不反序列化所有属性

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

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

更具体地说,评论和我引用

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