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>
Я надеюсь, что мог бы быть путь через Атрибут, который я могу украсить на свойстве...
Какой-либо способ избавиться от тех двух пространств имен, объявленных в корневом узле? Должен я?
В итоге я просто делал это ...
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());
}
[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; }
}
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.
Одним из способов решения этой проблемы является реализация в вашем классе интерфейса 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;
}
это хлопотно, но я не могу придумать другого пути. также это решение дает вам полный контроль над процессом сериализации (это преимущество)
, если вам нравится это решение и вы хотите получить полное, прокомментируйте, и я запишу его
относительно пространств имен - я не думаю вы можете избавиться от него (я, вероятно, не получу бонусный балл).