Saya mencoba untuk membuat serial TimeSpan
objek .NET ke XML dan tidak berfungsi. Google cepat telah menyarankan bahwa sementara TimeSpan
serializable, XmlCustomFormatter
tidak menyediakan metode untuk mengkonversi TimeSpan
objek ke dan dari XML.
Salah satu pendekatan yang disarankan adalah untuk mengabaikan TimeSpan
serialisasi, dan bukannya membuat serialisasi hasil TimeSpan.Ticks
(dan digunakan new TimeSpan(ticks)
untuk deserialisasi). Contohnya sebagai berikut:
[Serializable]
public class MyClass
{
// Local Variable
private TimeSpan m_TimeSinceLastEvent;
// Public Property - XmlIgnore as it doesn't serialize anyway
[XmlIgnore]
public TimeSpan TimeSinceLastEvent
{
get { return m_TimeSinceLastEvent; }
set { m_TimeSinceLastEvent = value; }
}
// Pretend property for serialization
[XmlElement("TimeSinceLastEvent")]
public long TimeSinceLastEventTicks
{
get { return m_TimeSinceLastEvent.Ticks; }
set { m_TimeSinceLastEvent = new TimeSpan(value); }
}
}
Meskipun ini tampaknya berfungsi dalam pengujian singkat saya - apakah ini cara terbaik untuk mencapai ini?
Apakah ada cara yang lebih baik untuk membuat serial TimeSpan ke dan dari XML?
c#
serialization
timespan
joeldixon66
sumber
sumber
Jawaban:
Cara Anda sudah memposting mungkin adalah yang terbersih. Jika Anda tidak menyukai properti tambahan, Anda bisa menerapkan
IXmlSerializable
, tetapi kemudian Anda harus melakukan segalanya , yang sebagian besar mengalahkan intinya. Saya dengan senang hati menggunakan pendekatan yang Anda posting; itu (misalnya) efisien (tidak ada penguraian kompleks dll), bebas tipe kultur, tidak ambigu, dan timestamp mudah dan umum dipahami.Selain itu, saya sering menambahkan:
Ini hanya menyembunyikannya di UI dan referensi dll, untuk menghindari kebingungan.
sumber
Ini hanya sedikit modifikasi pada pendekatan yang disarankan dalam pertanyaan, tetapi masalah Microsoft Connect ini merekomendasikan penggunaan properti untuk serialisasi seperti ini:
Ini akan membuat cerita berseri TimeSpan dari 0:02:45 sebagai:
Atau,
DataContractSerializer
TimeSpan mendukung.sumber
Sesuatu yang dapat bekerja dalam beberapa kasus adalah memberi properti umum Anda bidang dukungan, yang merupakan TimeSpan, tetapi properti publik terekspos sebagai string.
misalnya:
Ini ok jika nilai properti digunakan sebagian besar di kelas mengandung atau kelas warisan dan diambil dari konfigurasi xml.
Solusi yang diusulkan lainnya lebih baik jika Anda ingin properti publik menjadi nilai TimeSpan yang dapat digunakan untuk kelas lain.
sumber
Menggabungkan jawaban dari serialisasi Warna dan solusi asli ini (yang sangat bagus dengan sendirinya) Saya mendapatkan solusi ini:
di mana
XmlTimeSpan
kelas seperti ini:sumber
Anda bisa membuat pembungkus ringan di sekitar struct TimeSpan:
Contoh hasil serial:
sumber
Ticks
selama.Opsi yang lebih mudah dibaca adalah membuat cerita bersambung sebagai string dan menggunakan
TimeSpan.Parse
metode ini untuk membatalkan deserialisasi. Anda bisa melakukan hal yang sama seperti pada contoh Anda tetapi menggunakanTimeSpan.ToString()
pada pengambil danTimeSpan.Parse(value)
penyetel.sumber
Pilihan lain adalah membuat cerita bersambung menggunakan
SoapFormatter
kelas daripadaXmlSerializer
kelas.File XML yang dihasilkan terlihat sedikit berbeda ... beberapa "SABUN" - tag yang telah diperbaiki, dll ... tetapi dapat melakukannya.
Berikut ini
SoapFormatter
serialisasi jangka waktu 20 jam dan 28 menit untuk serial:Untuk menggunakan kelas SOAPFormatter, perlu menambahkan referensi ke
System.Runtime.Serialization.Formatters.Soap
dan menggunakan namespace dengan nama yang sama.sumber
Versi solusi saya :)
Edit: dengan asumsi itu nullable ...
sumber
Timespan disimpan dalam xml sebagai jumlah detik, tetapi mudah untuk diadopsi, saya harap. Timespan diserialisasi secara manual (menerapkan IXmlSerializable):
Ada contoh yang lebih komprehensif: https://bitbucket.org/njkazakov/timespan-serialization
Lihatlah Settings.cs. Dan ada beberapa kode rumit untuk menggunakan XmlElementAttribute.
sumber
Untuk serialisasi kontrak data, saya menggunakan yang berikut ini.
sumber
Jika Anda tidak ingin ada solusi, gunakan kelas DataContractSerializer dari System.Runtime.Serialization.dll.
sumber
Coba ini :
sumber