2011-10-09 9 views
7

Ho un po 'di problemi con la serializzazione dell'oggetto TimeZoneInfo. Stavo cercando di utilizzare la variabile TimeZoneInfo nel contratto di dati per il servizio WCF ma la serializzazione stava fallendo. Così ho scritto questo piccolo pezzo di codice per testare la serializzazione. Ecco una cosa che faccio:C# TimeZoneInfo serialization

 var fileName = "tmp.xml"; 
     var tz = TimeZoneInfo.Local; 
     var dataSer = new DataContractSerializer(typeof(TimeZoneInfo)); 

     try 
     { 
      using (var xml = new FileStream(fileName, FileMode.Create)) 
      { 
       dataSer.WriteObject(xml, tz); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

Ora, quando lo chiamo WriteObject metodo viene generata un'eccezione:

Type 'System.TimeZoneInfo+AdjustmentRule[]' with data contract name 'ArrayOfTimeZoneInfo.AdjustmentRule:http://schemas.datacontract.org/2004/07/System' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

Se tento di aggiungere [KnownType (typeof (System.TimeZoneInfo.AdjustmentRule []))] alla classe ottengo lo stesso errore. E se posso aggiungere questa riga per la mia interfaccia contratto dati ottengo errore di compilazione:

Error 1 'System.TimeZoneInfo.AdjustmentRule' is inaccessible due to its protection level

e in base alla classe di documentazione TimeZoneInfo implementa ISerializable quindi dovrebbe serializzare per impostazione predefinita.

Qualcuno può dirmi cosa sto facendo di sbagliato qui? Gradirei qualsiasi aiuto.

Grazie.

risposta

6

Non sono sicuro del motivo per cui non si limita a serializzare semplicemente, ma hai considerato solo la serializzazione dello ID? È probabile che sia piuttosto più efficiente - e più semplice! - che serializzare tutte le informazioni all'interno, e dovrebbe andare bene fino a quando entrambi i sistemi hanno quel fuso orario.

MODIFICA: si noti che questo non funziona con fusi orari personalizzati, per i quali si dovrebbe guardare ToSerializedString come indicato altrove.

+1

Si, voglio dire come un lavoro in giro che avrei dovuto fare qualcosa del genere. Ma mi piacerebbe che la variabile fosse tipizzata e in generale sono un po 'sconcertato sul perché questo non funzioni. Qual è il punto della classe che è ISerializable se non riesco a serializzarlo? – RedOctober

+1

@RedOctober: non lo so - sembra strano. Non so abbastanza su WCF per sapere se DataContractSerializer utilizza lo stesso formato del normale BinarySerializer che è I * credere * su ciò che è ISerializable. Si noti che se si serializza solo l'ID, quando si recupera nuovamente il fuso orario si ottengono le informazioni più aggiornate dal sistema operativo, anziché solo ciò che era noto al momento della serializzazione. Se questa è una cosa buona o meno dipende dalla tua situazione esatta, ovviamente. –

+1

1. Il comportamento sembra un bug nel framework. 2. L'ID non sarebbe sufficiente quando si ottiene il fuso orario personalizzato. Ho usato il metodo ToSerializedString come soluzione alternativa. (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.toserializedstring(v=vs.100).aspx) –

1

Non so perché. Come Jon ha suggerito una proprietà proxy con l'ID è probabilmente la strada da percorrere.

In alternativa, se è effettivamente necessario trasmettere il contenuto di TimeZoneInfo e supportare zone personalizzate, è necessario utilizzare una proprietà proxy che includa ToSerializedString() e FromSerializedString().

Problemi correlati