Как может я XML Сериализировать Свойство DateTimeOffset?

DateTimeOffset свойство, которое я имею в этом классе, не становится представленным, когда данные представлены как Xml. Что я должен сделать, чтобы сказать XML-сериализации представлять это надлежащее как a DateTime или DateTimeOffset?

[XmlRoot("playersConnected")]
public class PlayersConnectedViewData
{
    [XmlElement("playerConnected")]
    public PlayersConnectedItem[] playersConnected { get; set; }
}

[XmlRoot("playersConnected")]
public class PlayersConnectedItem
{
    public string name { get; set; }
    public DateTimeOffset connectedOn { get; set; }  // <-- This property fails.
    public string server { get; set; }
    public string gameType { get; set; }
}

и некоторые демонстрационные данные...

<?xml version="1.0" encoding="utf-8"?>
<playersConnected 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <playerConnected>
    <name>jollyroger1000</name>
    <connectedOn />
    <server>log1</server>
    <gameType>Battlefield 2</gameType>
  </playerConnected>
</playersConnected>

Обновление

Я надеюсь, что мог бы быть путь через Атрибут, который я могу украсить на свойстве...

Вопрос о премии

Какой-либо способ избавиться от тех двух пространств имен, объявленных в корневом узле? Должен я?

21
задан John Saunders 31 July 2010 в 06:57
поделиться

2 ответа

В итоге я просто делал это ...

Добавил два метода расширения ...

public static double ToUnixEpoch(this DateTimeOffset value)
{
    // Create Timespan by subtracting the value provided from 
    //the Unix Epoch then return the total seconds (which is a UNIX timestamp)
    return (double)((value - new DateTime(1970, 1, 1, 0, 0, 0, 0)
        .ToLocalTime())).TotalSeconds;
}

public static string ToJsonString(this DateTimeOffset value)
{
    return string.Format("\\/Date({0})\\/", value.ToUnixEpoch());
}

Изменен класс ViewData ...

[XmlRoot("playersConnected")]
public class PlayersConnectedItem
{
    public string name { get; set; }
    public string connectedOn { get; set; }
    public string server { get; set; }
    public string gameType { get; set; }
}

Изменен способ Я установил свойства viewdata ...

var data = (from q in connectedPlayerLogEntries
            select new PlayersConnectedItem
                       {
                           name = q.ClientName,
                           connectedOn =  q.CreatedOn.ToJsonString(),
                           server = q.GameFile.UniqueName,
                           gameType = q.GameFile.GameType.Description()
                        });

Готово. Не уверен, что это лучший способ ... но теперь это свойство viewdata имеет одинаковые значения для Json или Xml.

2
ответ дан 29 November 2019 в 06:56
поделиться

Одним из способов решения этой проблемы является реализация в вашем классе интерфейса IXmlSerializable . Реализация этого интерфейса заставляет сериализатор вызывать методы «переопределения» WriteXml и ReadXml .

что-то вроде этого:

public void WriteXml(XmlWriter w)
{
    wr.WriteStartElement("playersConnected"); 
    w.WriteElementString("name", Name);
    w.WriteElementString("connected-on" , ConnectedOn.ToString("dd.MM.yyyy HH:mm:ss"));
    //etc...
}

и когда вы это читаете:

DateTimeOffset offset;

if(DateTimeoffset.TryParse(reader.Value, out offset))
{
    connectedOn = offset;
}

это хлопотно, но я не могу придумать другого пути. также это решение дает вам полный контроль над процессом сериализации (это преимущество)

, если вам нравится это решение и вы хотите получить полное, прокомментируйте, и я запишу его

относительно пространств имен - я не думаю вы можете избавиться от него (я, вероятно, не получу бонусный балл).

2
ответ дан 29 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: