2010-09-22 41 views
1

假設我有一個非.NET應用程序,它需要通過DataContractSerializer編寫由.NET應用程序反序列化的數據。 描述確切格式必要的規範在哪裏?如何在與非.NET應用交談時確保與DataContractSerializer的互操作性?

這種規範應說明了很多東西,其中包括:

  • 請問兄弟元素的順序重要嗎?
  • xml命名空間URI應該始終以http://schemas.datacontract.org/2004/07/開頭嗎?
  • 做z:Id和z:參考值需要sequental或任何東西? (假設preserveObjectReferences==true)(好吧,我猜MSDN says this case is not even interoperable

似乎是一個簡單的問題,不是嗎?但我沒有看到它在MSDN中直接提到。 (我發現所有的東西都是forum-posts,說非.NET應用需要首先向.NET應用請求一個WSDL規範文件,但這看起來不對) )

回答

0

我們使用WSDL來協調Java和.net應用程序之間的服務定義,它對我們來說工作正常。

一件事,你需要注意的是數據類型使用,使用那些由兩個系統的理解,例如:

  • 如果您在.NET中創建的服務,不使用的數據集
  • 如果您在Java中創建服務不使用矢量
0

DataContractSerializer的不是WCF的一部分,它是運行系列化這WCF依賴的一部分。

我在過去曾使用DataContractSerializer反序列化XML中的對象,我已經生成了一個xml轉換。這可能是你想要做的事。

爲了弄清楚串行器所需的XML,我發現編寫一小段代碼可以更容易地將我的對象序列化爲一個字符串,以查看它應該如何結構化以及XML名稱空間是什麼。

[TestFixture] 
public class TestDataContractSerializerOutput 
{ 
    [Test] 
    public void Should_give_me_some_serialized_xml() 
    { 
     Foo foo = new Foo(); 
     foo.Bars.Add(new Bar { Name = "Wibble"}); 
     var dataContractSerializer = new DataContractSerializer(typeof(Foo), new[] { typeof(Bar) }); 

     using (Stream stream = new MemoryStream()) 
     { 
      dataContractSerializer.WriteObject(stream, foo); 
      stream.Position = 0; 

      using (StreamReader streamReader = new StreamReader(stream)) 
      { 
       Trace.WriteLine(streamReader.ReadToEnd()); 
      } 
     } 
    } 
} 

[DataContract] 
public class Foo 
{ 
    public Foo() 
    { 
     Bars = new List<IBar>(); 
    } 

    [DataMember] 
    public IList<IBar> Bars { get; set; } 
} 

public interface IBar 
{ 
    string Name { get; set; } 
} 

[DataContract] 
public class Bar : IBar 
{ 
    public string Name { get; set; } 
} 

有了這些信息,您可以看到如何構建XML,並且您還可以獲取xml模式以進行額外驗證。

+0

對,這就是我正在做的事情。但僅僅通過查看結果輸出,我無法知道我需要遵循的*約束條件。例如,我可能會在XML中看到'',但這是否意味着''也會起作用?我在這個問題中列出了其他例子。 – 2010-09-22 14:25:25

+0

不幸的是,我已經改變了工作,所以我不能看我以前做過的代碼,但我確實記得,只要它很好地形成,它就相當有利。我建議的是,您從VisualStudio(C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Xml \ Schemas)中的模式文件夾中獲取所需模式: – Bronumski 2010-09-22 15:17:09

+0

實際上,命名空間http://模式。microsoft.com/2003/10/Serialization/Arrays不在那裏,現在就響個不停。我認爲我所做的只是爲真正複雜的場景創建了許多單元測試,並確保它們能夠正常工作。隨着您的對象圖變化,只需讓您的測試保持最新狀態。 – Bronumski 2010-09-22 15:27:31