gpt4 book ai didi

c# - 在 xamarin android 应用程序中使用 DataContractJsonSerializer 时发布版本崩溃

转载 作者:搜寻专家 更新时间:2023-11-01 07:51:19 25 4
gpt4 key购买 nike

为了理解这个问题,我创建了一个纯空白的 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 的第 7 周期版本仍然会出现这种情况。我们遇到了同样的问题,现在已经通过添加

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

在发布配置的 Android csproj 文件中。

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

关于c# - 在 xamarin android 应用程序中使用 DataContractJsonSerializer 时发布版本崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com