2011-08-09 20 views
1

我想bcl.DateTime元素转换为XS:在XPathDocument的日期时间protobuf-net:bcl.DateTime到xs:dateTime?

这可能与issue #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> 
+0

我是否需要在UTL日期字符串上发送日期时间,例如2006-01-01T00:00:00Z http://code.google.com/apis/gdata/docs/2.0/elements.html – Damian

+0

(对不起,延迟;这一个滑过我) –

回答

0

有趣的; 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也许),并要么使用垫片属性在部分类中公开一个双值DateTime值到xs,或者(可能更好)使用单独的DTO来表示protobuf/xs方面和它们之间的映射。 A .proto不会在平台之间爱上bcl.DateTime

+0

理想情况下,我需要在.proto中指定这些东西,但只要我们这样做,问题就会显示在协议缓冲区的语言实现中。我选择以协调世界时(UTL)格式指​​定所有日期/时间,然后在用户想要查看它们时将转换应用到本地时区。 – Damian

+0

@ user800454啊,对 - 然后我有一个更好的选择...将更新 –

相关问题