繁体   English   中英

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

[英]How to ensure interoperability with DataContractSerializer when talking to non-.NET app?

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

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

  • 兄弟元素的顺序重要吗?
  • xml名称空间URI是否应始终以http://schemas.datacontract.org/2004/07/开头?
  • z:Id和z:Ref值需要是顺序值还是其他值? (假设preserveObjectReferences==true )(好吧,我想MSDN说这种情况甚至不能互操作
  • 等等

似乎是一个简单的问题,不是吗? 但是我看不到它在MSDN中直接解决。 (我发现的全部是论坛帖子,其中指出非.NET应用程序需要先向.NET应用程序请求WSDL规范文件。但这似乎是错误的。)

(除了DataContractSerializer,我没有使用WCF的任何东西)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM