2010-07-06 19 views
25

XmlSerializer kullanarak serileştirdiğim/kaldırdığım bir sınıfa sahibim. Bu sınıf bir DateTime alanını içerir. Serileştirildiğinde, DateTime alanı, GMT'nin ofsetini içeren bir dize, örneğin, 2010-05-05T09:13:45-05:00 ile temsil edilmektedir. Serileştirildiğinde, bu zamanlar, seri hale getirmeyi gerçekleştiren makinenin yerel saatine dönüştürülür.DateTime değerinin seri hale getirilmesinde zaman dilimi dönüşümü önleme

Açıklamaya değmez nedenlerden dolayı, bu saat dilimi dönüşümünün gerçekleşmesini önlemek istiyorum. Serileştirme, bu sınıfın birden çok sürümünün mevcut olduğu vahşi ortamda gerçekleşir. Deserialization, kontrolüm altındaki bir sunucuda gerçekleşir. Bu şekilde, bu, seri hale getirme sırasında en iyi şekilde ele alınacak gibi görünüyor.

IXmlSerializable'u uygulamaktan ve tüm serileştirmeyi "elinizle" yapmaktan başka nasıl gerçekleştirebilirim?

+0

Bu sorunun tam tersi hakkında bana bir bağlantı verebilecek olan var mı? (DateTime .Net sunucusundan JavaScript istemcisine geçiş) – Siddhant

cevap

22

DateTime olarak ayrıştırmak yerine, DateTimeOffset olarak ayrıştırabilir ve saat dilimini yok saymak için DateTimeOffset.DateTime özelliğini kullanabilirsiniz. Şunun gibi:

[XmlIgnore()] 
public DateTime Time { get; set; } 

[XmlElement(ElementName = "Time")] 
public string XmlTime 
{ 
    get { return XmlConvert.ToString(Time, XmlDateTimeSerializationMode.RoundtripKind); } 
    set { Time = DateTimeOffset.Parse(value).DateTime; } 
} 
+0

Ayrıca, varlık çerçevesini kullandığım için [NotMapped] öğesini [XmlElement ...] üstüne koymam gerekiyordu, ancak bu çözüm benim için mükemmel çalışıyor. teşekkürler –

2

Eğer this yazı anlaşılacağı gibi bir şey denemek ve yeni bir dize özelliğini yapıp mevcut bir XmlIgnore Could:

Zaman mülkiyet [XmlIgnore] koyun.

Sonra yeni bir özellik ekleyin:

[XmlElement(DataType="string",ElementName="Time")] 
public String TimeString 
{ 
    get { return this.timeField.ToString("yyyy-MM-dd"); } 
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } 
} 
+0

Güncelleştirilmiş sürümü kullanarak sınıfın eski sürümlerini deserialize etmem gerekiyor. Bu mola uyumu olmaz mı? DateTime özelliğimi yeniden adlandırabilir ve DateTime'in kullandığı aynı ada sahip bir dize özelliği ekleyebilirim. Ancak, bu DateTime özelliğine başvuran istemcileri bozar. – Odrade

+1

Oh, şimdi Element isminin Xml'de aynı kalacağını görüyorum. Bunu deneyeyim. – Odrade

+1

Bu kod, varolan istemcilerinizle çalışmayacaktır, çünkü DateTime.ParseExact başarısız olacaktır (çünkü zaman bu formatta değil). Bir DateTimeOffset olarak ayrıştırırsanız, varolan istemcilerinizle çalışır. –

2

Bu eski olduğunu biliyorum ama bu ileride kimse yardımcı olur.

enter image description here

O üretmek 3. taraf görünür: Ben 30 değil 31 ile bitirmek XML serisi kaldırılırken sonra

<timePeriod>1982-03-31T00:00:00+11:00</t 

: Burada

Ben deserializing edildi XML'dir Bu XML (kullanıyorum), gün ışığından yararlanma sırasında TimeZone'u +11 olarak değiştirir ve Yaz Saati Uygulaması (DST) olmadığı zaman +10 olarak kalır. Jon Skeet UTC en uygun

DST almamaları gerektiğini: https://stackoverflow.com/a/5495816/495455


Ayrıca belgeleri Coding Best Practices Using DateTime in the .NET Framework not:

XML seri hale getirici her zaman DateTime değerleri yerel makine saati temsil dizgeleştirme varsayar, böylece kodlanmış XML zamanının ofset kısmı olarak makinenin yerel saat dilimi ofsetini uygular. Bunu başka bir makineye serpiştirdiğimizde, orijinal ofset ayrıştırılan değerden çıkarılır ve mevcut makinenin zaman bölgesi ofseti eklenir.


Aşağıdaki kod 31 olarak biçimlendirilmiş tarihi almak için bana izin ama alışkanlık (bu yem verilen) olmayan Daylioght Tasarruf tarihlerde% 100 çalışır:

TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
DateTime easternTimeNow = TimeZoneInfo.ConvertTimeFromUtc(dataPoint.timePeriod, easternZone); 
System.Diagnostics.Debug.WriteLine(easternTimeNow.ToString()); 

Dolayısıyla çözüm XML feed'ini düzeltin, böylece UTC'leri DST ile değiştirmez.

DÜZENLEME: YS ile UTC değişen onun DEĞİL 3. parti satıcı bakılırsa veri yukarı

vidalı neden. XML beslemesi, SQL dB okuma Java Swing framework tarafından oluşturulur. Normalde XML standart gösterimi (xsd: dateTime) - IS0 8601 ile devam etmenizi öneririm, ancak bu durumda string kullanarak ve T işten sonra her şeyi yırtıyorum. Feragatname, hala besleme değiştirmeye çalışıyorum, bunu PROD içinde yapmamanızı tavsiye ederim. Kendi sorumluluğunuzda kullanın!

Yaptıklarımı
27

, aşağıdaki gibi bir yöntem DateTime.SpecifyKind kullanmaktı:

DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified); 

Ve bu benim sorunu çözmek, ben bu yardımı umut.

İlgili konular