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.
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
@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. 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) –