繁体   English   中英

在Xamarin Android应用程序中使用DataContractJsonSerializer时,版本版本会崩溃

[英]Crash in Release build when using DataContractJsonSerializer in xamarin android app

为了理解该问题,我创建了一个普通的空白Xamarin Android应用。 通过以下简单的代码,我可以在按下按钮时使应用程序的发行版崩溃。 请注意,为了进行构建,我需要添加对System.Runtime.Serialization的引用:

   protected override void OnCreate(Bundle bundle)
   {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += delegate
        {
            using (MemoryStream stream = new MemoryStream())
            {
                DateTimeOffset offset = new DateTimeOffset(DateTime.Now);
                string serializedOffset;

                var serializer = new DataContractJsonSerializer(typeof(DateTimeOffset));
                Log.Info(nameof(MainActivity), "HACKAGE:about to serialize");
                serializer.WriteObject(stream, offset);
                serializedOffset = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Position);
                Log.Info(nameof(MainActivity), "HACKAGE: got serialized" + serializedOffset);
            }
            button.Text = string.Format("{0} clicks!", count++);
        };
    }
    static void ExistenceCausesCrash(string serializedObject)
    {
        DateTimeOffset resultEx;
        var serializer = new DataContractJsonSerializer(typeof(DateTimeOffset));
        byte[] serializedObjectBytes = Encoding.UTF8.GetBytes(serializedObject);
        using (var stream = new MemoryStream(serializedObjectBytes))
        {
            resultEx = (DateTimeOffset)serializer.ReadObject(stream);
        }
    }

有趣的是:如果我注释掉ExistenceCausesCrash()例程,则应用程序不会崩溃。

我在用:

    Microsoft Visual Studio Enterprise 2015
    Version 14.0.24720.00 Update 1
    Microsoft .NET Framework
    Version 4.6.01038

    Xamarin   4.0.0.1717 (1390b70)
    Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android.

    Xamarin.Android   6.0.0.35 (d300845)
    Visual Studio plugin to enable development for Xamarin.Android.

    Xamarin.iOS   9.3.99.33 (ea30b32)
    Visual Studio extension to enable development for Xamarin.iOS.

在我看来,这是在我升级到4.0.0.1717时开始发生的

在logcat中,我看到:

    01-06 12:32:01.850: I/MonoDroid(18126): UNHANDLED EXCEPTION:
    01-06 12:32:01.861: I/MonoDroid(18126): System.Runtime.Serialization.InvalidDataContractException: No set method for property 'OffsetMinutes' in type 'System.Runtime.Serialization.DateTimeOffsetAdapter'.
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.DataContract+DataContractCriticalHelper.ThrowInvalidDataContractException (System.String message, System.Type type) [0x0007b] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.DataContract.ThrowInvalidDataContractException (System.String message, System.Type type) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonFormatWriterInterpreter.WriteToJson (System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.Runtime.Serialization.ClassDataContract dataContract, System.Xml.XmlDictionaryString[] memberNames) [0x00051] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonFormatWriterGenerator+CriticalHelper+<GenerateClassWriter>c__AnonStorey0.<>m__0 (System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.Runtime.Serialization.ClassDataContract dataContract, System.Xml.XmlDictionaryString[] memberNames) [0x0000b] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonClassDataContract.WriteJsonValueCore (System.Runtime.Serialization.XmlWriterDelegator jsonWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00027] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonDataContract.WriteJsonValue (System.Runtime.Serialization.XmlWriterDelegator jsonWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00007] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteJsonValue (System.Runtime.Serialization.Json.JsonDataContract contract, System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.WriteDataContractValue (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, RuntimeTypeHandle declaredTypeHandle) [0x0003d] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, System.Type declaredType) [0x0007a] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.SerializeWithXsiTypeAtTopLevel (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, System.Type graphType) [0x00066] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObjectContent (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00110] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObject (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00008] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.InternalWriteObject (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) [0x00079] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject (System.Xml.XmlDictionaryWriter writer, System.Object graph) [0x0000d] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject (System.IO.Stream stream, System.Object graph) [0x00018] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at XamarinDateTimeOffsetBugApp1.MainActivity+<>c__DisplayClass1_0.<OnCreate>b__0 (System.Object <sender>, System.EventArgs <e>) [0x00030] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at Android.Views.View+IOnClickListenerImplementor.OnClick (Android.Views.View v) [0x00014] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (IntPtr jnienv, IntPtr native__this, IntPtr native_v) [0x00011] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at (wrapper dynamic-method) System.Object:0d369c4c-eddc-4ca3-ad2e-8d81a770584b (intptr,intptr,intptr)

我认为这是由于Xamarin.Android链接过于激进。 Xamarin的cycle 7版本仍然会发生这种情况。 我们遇到了同样的问题,目前通过添加解决此问题

<AndroidLinkSkip>System.Runtime.Serialization</AndroidLinkSkip>

在Android csproj文件中进行Release配置。

等待Xamarin更新并为此进行适当的修复...请参阅https://bugzilla.xamarin.com/show_bug.cgi?id=37491

您的问题在这里:

没有为类型“ System.Runtime.Serialization.DateTimeOffsetAdapter”设置属性“ OffsetMinutes”的方法。

检查您是否在使用电话的地方进行通话。

如果在执行发行版本时使用的是proguard,请确保不会删除引起问题的方法。

另外,请检查此帖子以获取其他用户报告的相同异常的答案。

暂无
暂无

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

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