Я пытаюсь сериализовать TimeSpan
объект .NET в XML, и он не работает. Быстрый Google предположил, что, хотя TimeSpan
сериализуемо, XmlCustomFormatter
он не предоставляет методы для преобразования TimeSpan
объектов в и из XML.
Один из предложенных подходов состоял в том, чтобы игнорировать TimeSpan
сериализацию и вместо этого сериализовать результат TimeSpan.Ticks
(и использовать new TimeSpan(ticks)
для десериализации). Пример этого следующий:
[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); }
}
}
Хотя, похоже, это работает в моем кратком тестировании - это лучший способ достичь этого?
Есть ли лучший способ сериализации TimeSpan в и из XML?
c#
serialization
timespan
joeldixon66
источник
источник
Ответы:
То, как вы уже написали, возможно, самое чистое. Если вам не нравится дополнительное свойство, вы можете реализовать его
IXmlSerializable
, но тогда вам придется делать все , что в значительной степени противоречит сути. Я бы с радостью воспользовался тем подходом, который вы опубликовали; он (например) эффективен (без сложного анализа и т. д.), легко и обычно понятен, независимо от культуры, однозначных чисел и меток времени.Кроме того, я часто добавляю:
Это просто скрывает его в пользовательском интерфейсе и в ссылках на библиотеки DLL, чтобы избежать путаницы.
источник
Это лишь небольшая модификация подхода, предложенного в этом вопросе, но эта проблема Microsoft Connect рекомендует использовать свойство для сериализации, например:
Это будет сериализовать TimeSpan 0:02:45 как:
В качестве альтернативы,
DataContractSerializer
поддерживает TimeSpan.источник
Что-то, что может работать в некоторых случаях, это предоставить вашему публичному свойству вспомогательное поле, которое является TimeSpan, но публичное свойство отображается в виде строки.
например:
Это нормально, если значение свойства в основном используется в содержащем или наследующем классе и загружается из конфигурации xml.
Другие предложенные решения лучше, если вы хотите, чтобы открытое свойство было пригодным для использования значением TimeSpan для других классов.
источник
Комбинируя ответ из сериализации Color и это оригинальное решение (которое само по себе прекрасно), я получил это решение:
где
XmlTimeSpan
класс такой:источник
Вы можете создать легкую оболочку вокруг структуры TimeSpan:
Образец сериализованного результата:
источник
Ticks
как долго.Более читаемым вариантом будет сериализация в виде строки и использование
TimeSpan.Parse
метода для десериализации. Вы можете сделать то же самое, что и в вашем примере, но использоватьTimeSpan.ToString()
в геттере иTimeSpan.Parse(value)
в сеттере.источник
Другой вариант - сериализовать его, используя
SoapFormatter
класс, а неXmlSerializer
класс.Полученный XML-файл выглядит немного иначе ... некоторые теги с префиксом SOAP и т. Д., Но он может это сделать.
Вот что
SoapFormatter
сериализовано в 20 часов и 28 минут:Чтобы использовать класс SOAPFormatter, необходимо добавить ссылку
System.Runtime.Serialization.Formatters.Soap
и использовать пространство имен с тем же именем.источник
Моя версия решения :)
Изменить: при условии, что это обнуляется ...
источник
Timespan хранится в xml как количество секунд, но я надеюсь, что его легко принять. Timespan, сериализованный вручную (реализующий IXmlSerializable):
Есть более полный пример: https://bitbucket.org/njkazakov/timespan-serialization
Посмотрите на Settings.cs. И есть некоторый хитрый код для использования XmlElementAttribute.
источник
Для сериализации контракта данных я использую следующее.
источник
Если вы не хотите обходных путей, используйте класс DataContractSerializer из System.Runtime.Serialization.dll.
источник
Попробуй это :
источник