protobuf-net: bcl.DateTime to xs: dateTime? - PullRequest
       18

protobuf-net: bcl.DateTime to xs: dateTime?

1 голос
/ 09 августа 2011

Я бы хотел, чтобы элементы bcl.DateTime были преобразованы в xs: dateTime в XPathDocument

Это может быть связано с , проблема # 69

Я создал небольшой тестПроект, подобный этому

test.proto

import "bcl.proto";

message Test {
    required bcl.DateTime tAsOf = 1;    
}

program.cs

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;
using ProtoBuf;
using test;

namespace DateTimeXML
{
    class Program
    {
        static void Main()
        {
            var d = new bcl.DateTime() {value = new DateTime(2011, 7, 31).Ticks};
            var t = new Test() {tAsOf = d};
            var xml = Serialize(t);
            WriteXpathDocument(xml, "c:\\temp\\xpathdoc.xml");
        }

        private static XPathDocument Serialize(Test obj)
        {
            XPathDocument xmlDoc;
            Serializer.PrepareSerializer<Test>();

            var x = new XmlSerializer(obj.GetType());
            using (var memoryStream = new MemoryStream())
            {
                using (TextWriter w = new StreamWriter(memoryStream))
                {
                    x.Serialize(w, obj);
                    memoryStream.Position = 0;
                    xmlDoc = new XPathDocument(memoryStream);
                }
            }
            return xmlDoc;
        }

        private static void WriteXpathDocument(XPathDocument xpathDoc, string filename)
        {
            // Create XpathNaviagtor instances from XpathDoc instance.
            var objXPathNav = xpathDoc.CreateNavigator();

            // Create XmlWriter settings instance.
            var objXmlWriterSettings = new XmlWriterSettings();
            objXmlWriterSettings.Indent = true;

            // Create disposable XmlWriter and write XML to file.
            using (var objXmlWriter = XmlWriter.Create(filename, objXmlWriterSettings))
            {
                objXPathNav.WriteSubtree(objXmlWriter);
                objXmlWriter.Close();
            }
        }
    }     
}

создает следующий XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <tAsOf>
    <value>634476672000000000</value>
  </tAsOf>
</Test>

1 Ответ

0 голосов
/ 10 августа 2011

Интересный; тип bcl.DateTime действительно предназначен для представления внутреннего формата DateTime и не предназначен для непосредственного использования. Я, вероятно, должен исправить это, чтобы интерпретировать bcl.DateTime как DateTime во время перевода, но использование более типичное здесь (так как вы говорите о типах .NET, таких как DateTime) было бы первым в коде т.е.

[ProtoContract]
class Test {
    [ProtoMember(1, IsRequired = true)]
    public DateTime AsOf {get;set;}  
}

тогда это должно работать как нужно для целей protobuf и xs.

Вам нужен .proto здесь? Я могу это исправить, я просто хочу знать, требуется ли это.


В отношении комментариев / обновлений и повторного использования .proto - я настоятельно рекомендую использовать самый простой общий формат для значения времени - возможно, long (или string возможно) и либо использовать свойства shim в частичном классе, чтобы выставить двойное значение DateTime для xs, или (возможно, лучше) использовать отдельный DTO для представления аспектов protobuf / xs и отображения между ними. .Proto не будет любить bcl.DateTime между платформами.

...