Override XML Serialization Method

I'm having trouble adjusting how DateTime variables are serialized in my objects. I want it to be output as 2011-09-26T13: 00: 00Z, but when I redefine the GetObjectData () function, I think this is the way to do this, the XML data for them is not output at all.

[DataContract(Namespace = "")] [XmlRootAttribute(Namespace = "http://www.w3.org/2005/Atom", ElementName = "feed")] public class GCal { [XmlNamespaceDeclarations] public XmlSerializerNamespaces _xsns = new XmlSerializerNamespaces(); [XmlElement(ElementName = "entry")] public Collection<MMU.Calendar.gCalEvent> items = new Collection<MMU.Calendar.gCalEvent>(); /*some other elements*/ } public class gCalEvent { [XmlElement(Namespace = "http://schemas.google.com/g/2005")] public gdEvent when = new gdEvent(); /*some other elements*/ } public class gdEvent : ISerializable { [XmlAttribute(AttributeName = "startTime")] private DateTime _startTime; [XmlAttribute(AttributeName = "endTime")] private DateTime _endTime; public gdEvent(DateTime startTime, DateTime endTime) { _startTime = startTime; _endTime = endTime; } public gdEvent() { _startTime = DateTime.MinValue; _endTime = DateTime.MinValue; } [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { //needs to be in the format 2011-09-26T13:00:00Z //if (_startTime != DateTime.MinValue) info.AddValue("startTime", _startTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); //if (_endTime != DateTime.MinValue) info.AddValue("endTime", _endTime.ToString("yyyy-MM-ddTHH:mm:ssZ")); } } GCal calendar = new GCal(); calendar = readSwsSpreadsheet(urlToCall); stream = new MemoryStream(); XmlSerializer serializer = new XmlSerializer(typeof(GCal)); serializer.Serialize(stream, calendar); stream.Seek(0, SeekOrigin.Begin); Stream results = new MemoryStream(); WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; return stream; 

I tried to view this information, but there seems to be a lot about custom serialization for files, but not in XML ...

+4
source share
2 answers

I had a suggestion from @craighawker to format DateTime in a string when calling the set () method on DateTime. It seemed like the easiest method, although I would like to implement it appropriately, using IXMLSerializable at some point in the future to do more powerful things

  public class gdEvent { [XmlAttribute(AttributeName = "startTime")] private string m_startTimeOutput; private DateTime m_startTime; //format 2011-11-02T09:00:00Z [XmlAttribute(AttributeName = "endTime")] private string m_endTimeOutput; private DateTime m_endTime; //2011-11-02T10:00:00Z public DateTime startTime { get { return m_startTime; } set { m_startTime = value; m_startTimeOutput = m_startTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); } } public DateTime endTime { get { return m_endTime; } set { m_endTime = value; m_endTimeOutput = m_endTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); } } 
+1
source

You are trying to set up standard serialization (ISerializable) for a property type whose content type is serialized using XmlSerializer. You need to implement the IXmlSerializable interface to configure XML serialization. Try something like this:

 public class gdEvent : IXmlSerializable { private DateTime _startTime; private DateTime _endTime; public gdEvent(DateTime startTime, DateTime endTime) { _startTime = startTime; _endTime = endTime; } public gdEvent() { _startTime = DateTime.MinValue; _endTime = DateTime.MinValue; } public XmlSchema GetSchema() { return null; } public void WriteXml(XmlWriter writer) { if (_startTime != DateTime.MinValue) writer.WriteAttributeString("startTime", _startTime.ToString("yyyy-MM-ddTHH:mm:ssZ")); if (_endTime != DateTime.MinValue) writer.WriteAttributeString("endTime", _endTime.ToString("yyyy-MM-ddTHH:mm:ssZ")); } public void ReadXml(XmlReader reader) { string startTimeString = reader.GetAttribute("startTime"); if (!string.IsNullOrEmpty(startTimeString)) { _startTime = DateTime.Parse(startTimeString); } string endTimeString = reader.GetAttribute("startTime"); if (!string.IsNullOrEmpty(endTimeString)) { _endTime = DateTime.Parse(endTimeString); } } 

}

+6
source

Source: https://habr.com/ru/post/1400359/


All Articles