IXmlSerializable Type 'System.Xml.Linq.XElement' 必须具有默认构造函数

本文关键字:默认 构造函数 Linq Type System Xml IXmlSerializable XElement | 更新日期: 2024-11-03 21:13:01

我正在尝试从Monotouch(ios)上的Web服务中获取数据。我使用 SlSvcUtil 创建了一个代理类,我正在尝试从我的代理类访问一个方法,如下所示

void OnGotResult(object sender, GetDataCompletedEventArgs  e)
{
    resultsLabel.Text = e.Result.ToString();
}

当我尝试访问从代理类生成的类中GetDataCompletedEventArgs方法时,它会抛出带有消息的异常

System.Runtime.Serialization.InvalidDataContractException:IXmlSerializable Type 'System.Xml.Linq.XElement' 必须具有默认构造函数。

异常堆栈跟踪:

at System.Runtime.Serialization.XmlDataContractInterpreter.GetConstructor () [0x00059] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/System.Runtime.Serialization/ReferenceSources/XmlDataContract_static.cs:49 at System.Runtime.Serialization.XmlDataContractInterpreter.CreateXmlSerializable () [0x00025] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/System.Runtime.Serialization/ReferenceSources/XmlDataContract_static.cs:34 at System.Runtime.Serialization.XmlDataContract.m__0 () [0x00000] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Runtime.Serialization/System/Runtime/Serialization/XmlDataContract.cs:14 at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadIXmlSerializable (System.Runtime.Serialization.XmlSerializableReader xmlSerializableReader, System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Runtime.Serialization.XmlDataContract xmlDataContract, Boolean isMemberType) [0x0008e] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Runtime.Serialization/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs:555 at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadIXmlSerializable (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Runtime.Serialization.XmlDataContract xmlDataContract, Boolean isMemberType) [0x00016] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Runtime.Serialization/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs:525 at System.Runtime.Serialization.XmlDataContract.ReadXmlValue (System.Runtime.Serialization.XmlReaderDelegator xmlReader, System.Runtime.Serialization.XmlObjectSerializerReadContext context) [0x00014] in/Users/builder/data/lanes/2377/73229919/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Runtime.Serialization/System/Runtime/Serialization/XmlDataContract.cs:455

帮我解决这个问题。

IXmlSerializable Type 'System.Xml.Linq.XElement' 必须具有默认构造函数

第一步是确保你使用的是最新版本的 Xamarin.iOS。Xamarin.iOS 9.6.1.9 很好。Xamarin.iOS 9.4或9.2也应该可以工作。

接下来,需要告诉托管链接器保留默认的构造函数System.Xml.Linq.XElement因为该构造函数很可能只能通过当前应用中的反射进行访问。保留该类型的一种方法是使用"自定义链接器配置":

  1. 在 iOS 应用项目中创建新的Linker.xml文件。(如果需要,可以更改文件名。

  2. 添加以下行:

    <linker>
        <assembly fullname="System.Xml.Linq">
            <type fullname="System.Xml.Linq.XElement">
                <method name=".ctor" />
            </type>
        </assembly>
    </linker>
    
  3. 对于启用了托管链接器的每个配置(如"调试|iPhone"),请在"iOS 生成>其他 mtouch 参数>"项目选项"下添加以下文本:

    --xml=Linker.xml