代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

在与非.NET应用程序对话时,如何确保与DataContractSerializer的互操作性?

  •  1
  • Stefan Monov  · 技术社区  · 15 年前

    假设我有一个非.NET应用程序,它需要通过DataContractSerializer编写要由.NET应用程序反序列化的数据。 描述准确格式的规范在哪里?

    这样的规范应该描述很多东西,包括:

    • 兄弟元素的顺序重要吗?
    • XML命名空间URI是否应始终以开头 http://schemas.datacontract.org/2004/07/ ?
    • z:id和z:ref值需要是连续的还是其他的?(假设 preserveObjectReferences==true )(好吧,我想 MSDN says this case is not even interoperable )

    好像是个简单的问题,不是吗?但我看不到它直接在msdn中的地址。(我只找到了 forum-posts 说非.NET应用程序需要先向.NET应用程序请求WSDL规范文件。但这似乎是错误的。)

    (除了DataContractSerializer,我不使用来自WCF的任何内容)

    2 回复  |  直到 15 年前
        1
  •  0
  •   Shiraz Bhaiji    15 年前

    我们使用WSDL来协调Java和.NET应用程序之间的服务定义,它对我们来说很好。

    您需要注意的一件事是使用哪种数据类型,请使用两个系统都能理解的数据类型,例如:

    • 如果在.NET中创建服务,请不要使用数据集
    • 如果在Java中创建服务,请不要使用向量
        2
  •  0
  •   Bronumski    15 年前

    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模式以进行额外的验证。

    推荐文章