2016-03-01 14 views
9

sto usando il ComponentSerializationService come si trova here:ComponentSerializationService non deserializzazione tutte le proprietà

Quando si taglia un controllo dal servizio di progettazione il metodo serialize viene chiamato, e quando si incolla deserializzare.

Nel mio esempio: ho un semplice pulsante e ho cambiato il colore dello sfondo.

Serialize si presenta così:

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

E Deserialize assomiglia a questo:

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

Ho impostato i punti di interruzione in entrambi i metodi e l'oggetto in entrata contiene la proprietà di sfondo corretto, ma una volta deserializzati la proprietà non è persistente.

Tutte le idee sono benvenute. Questa è una classe difficile con molto poco nella riga di esempi di codice o documentazione.

+0

Hai provato a utilizzare il metodo di sovraccarico come documentato in [MSDN] (https://msdn.microsoft.com/en-us/library/hyft4ewk (v = vs.110) .aspx) Sembra il motivo perché lo sfondo non è persistito in quanto non ci sono contenitori? – t0mm13b

+1

Hai provato Newtonsoft.Json.JsonConvert? Questo serializza/deserializza qualsiasi tipo complesso. L'ho usato prima ed è fantastico. –

+0

Sono sicuro che il tuo problema è: una volta lanciato il tuo SerializationStore su un oggetto .... non sai più cosa sia ... quindi nella tua Deserializzazione non dovresti essere in grado di restituirlo a SerializationStore, dovresti impostare un semplice test per dimostrarlo. Inoltre non stai mostrando cosa serializationService.Serialize (serializationStore, obj); fa ... personalmente penso che la tua complicità sia finita. perché non usare la normale serializzazione e deserializzazione .... tipo implementazione. Perché la necessità di quella personalizzata? modifica Vedo che ComponentSerializationService è una classe ms fornita – Seabizkit

risposta

1

Si dovrebbe dare un'occhiata a questo, e vedere se la SerializeAbsolute funziona per voi :)

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

Più in particolare l'Osservazione e cito

serializzazione standard, come attuata attraverso il metodo Serialize, serializza solo i valori che differiscono dallo stato predefinito del componente. Fornisce il meccanismo di serializzazione più compatto ma assume che un oggetto appena creato verrà utilizzato durante la deserializzazione. Se viene utilizzato un oggetto esistente , l'oggetto deserializzato risultante non è garantito da per duplicare lo stato originale dell'oggetto serializzato; le proprietà che contenevano valori predefiniti durante la serializzazione non saranno ripristinate sui valori predefiniti durante la deserializzazione . Il metodo SerializeAbsolute non utilizza questo collegamento. Serializza tutte le proprietà dell'oggetto sorgente in modo che la deserializzazione possa ripristinare tutte le proprietà dell'oggetto, indipendentemente dallo stato predefinito.

Problemi correlati