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

时间:2010-09-22 13:40:03

标签: .net format datacontractserializer interop specifications

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

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

  • 兄弟元素的顺序是否重要?
  • xml名称空间URI是否始终以http://schemas.datacontract.org/2004/07/
  • 开头
  • 做z:Id和z:Ref值需要是sequental还是其他什么? (假设preserveObjectReferences==true)(好吧,我想MSDN says this case is not even interoperable
似乎是一个简单的问题,不是吗?但我不认为它直接在MSDN中解决。 (我发现只有forum-posts说非.NET应用程序需要首先向.NET应用程序询问WSDL规范文件。但这似乎是错误的。)

(我不使用WCF以外的任何东西,而不是DataContractSerializer)

2 个答案:

答案 0 :(得分:0)

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

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

  • 如果您在.net中创建服务,请不要使用数据集
  • 如果您在java中创建服务,请不要使用向量

答案 1 :(得分: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架构以进行额外验证。