Xamarin.Forms SOAP反序列化在Android上失败

ubby3x7f  于 2023-04-04  发布在  Android
关注(0)|答案(1)|浏览(150)

在一个Xamarin.Forms项目中,我在反序列化WebService响应时遇到了奇怪的效果。
在服务器端我有

namespace MyTestWebservice
{
    [WebService(Namespace = "https://example.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [WebMethod(EnableSession = true)]
    public class AppInterface : System.Web.Services.WebService
    {
        public GeneralClass TestMethod(int param)
        {
            return /* Resulting instance */
        }
    }
}

数据如下:

namespace MyTestWebservice
{       
    [XmlInclude(typeof(TestClass1))]
    [XmlInclude(typeof(TestClass2))]
    public abstract class TestBase
    {
        public int Prop1 { get; set; }
        public string Prop2 { get; set; }
    }

    public class TestClass1 : TestBase
    {
        public int Prop3 { get; set; }
        public string Prop4 { get; set; }
    }

    public class TestClass2 : TestBase
    {
        public int Prop5 { get; set; }
        public string Prop6 { get; set; }
    }

    public class Other
    {
        public string Prop7 { get; set; }
    }

    public class GeneralClass
    {
        public int Prop0 { get; set; }
        public TestBase[] Values { get; set; }
    }
}

在VisualStudio 2022中,我生成了向Web Service发送/接收请求的代码。代码看起来不错(据我所见),在MyApp.UWP(Windows上的服务器,Windows上的客户端)中,一切都运行良好,即所有数据都正确地从服务器传输到应用程序。
然而,在MyApp.Android(Windows上的服务器,Android Emulator上的客户端)中,只有基类TestBase和引用类Other的数据被设置,而TestClass1TestClass2中的数据保持未设置,即0null
这是Xamarin.Forms中的一个已知错误吗?我该如何解决?或者在一些属性/类定义上需要更多的属性?

wz3gfoph

wz3gfoph1#

我找到了答案here
问题是,在客户端,带有参数Order的XmlElementAttribute被附加到生成的代码中的属性:

public class TestBase
{
    [System.Xml.Serialization.XmlElementAttribute(Order=0)] 
    public int Prop1 { get; set; }
    [System.Xml.Serialization.XmlElementAttribute(Order=1)] 
    public string Prop2 { get; set; }
}

然而,对于派生类TestClass1TestClass2中的属性,Order0开始计数,而不是2。因此,在Visual Studio中生成客户端代码后,我必须手动更改顺序。然后在Android上运行良好。
是否有更新的版本修复了此错误?

相关问题