我试图序列化/反序列化复杂类型.我希望保留对象引用,这意味着如果在对象图中多次引用对象的实例,则在反序列化期间,我希望反序列化器仅创建该实例一次并多次引用它(与创建该对象实例相比)多次).
我需要系统处理的第二件事是字典,其中密钥本身就是一个复杂类型.
我能够通过DataContractSerializer序列化到XML来实现这两个目标.但是,我没有找到任何可以执行此操作的Json序列化程序.我试过Json.NET和ServiceStack,但没有运气.
请参阅以下示例代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;
using Newtonsoft.Json;
namespace Serialization
{
class Program
{
static void Main(string[] args)
{
var transportModel = CreateSampleModel();
//Serialize with DataContractSerializer
var serializer = new DataContractSerializer(typeof(TransportModel), null, int.MaxValue, false, true, null, null);
string serializedObjectXml;
using (var sw = new StringWriter())
{
using (var writer = new XmlTextWriter(sw))
{
serializer.WriteObject(writer, transportModel);
writer.Flush();
serializedObjectXml = sw.ToString();
}
}
//Deserialize with DataContractSerializer
byte[] byteArray = Encoding.ASCII.GetBytes(serializedObjectXml); …Run Code Online (Sandbox Code Playgroud) 我使用的是Z3的.NET API.当我通过调用实例化解算器时:
Solver s = ctx.MkSolver(ctx.TryFor(ctx.MkTactic("qflia"), TimeLimit));
Run Code Online (Sandbox Code Playgroud)
对于某些型号的声明,给它一个60秒(60000毫秒)的TimeLimit
s.Check()
Run Code Online (Sandbox Code Playgroud)
60秒后不返回.对于某些型号,它会在几秒钟后返回,在我的情况下不会出现问题,但对于某些型号它根本不会返回(我在3天后取消了该过程).
如何在给定的时间限制后强制Z3停止检查?
正如标题所示,我正在使用https://material.angular.io/components/bottom-sheet/overview。当底部工作表打开并且用户单击浏览器的后退按钮时,他将被导航离开打开底部工作表的页面。相反,我只想关闭“浏览器返回”上的底部工作表。在 Angular 5/6 中实现这一目标的最佳方法(如果有)是什么?
我有一个Xamarin.Forms应用程序,在我的App类中使用此代码(是的,这只是一个演示问题的示例):
public App()
{
BlobCache.ApplicationName = "MyApp";
BlobCache.EnsureInitialized();
// The root page of your application
MainPage = GetMainPage();
}
public object BlockingGetExternalUser()
{
return GetExternalUser().Result;
}
private async Task<object> GetExternalUser()
{
try
{
return await BlobCache.LocalMachine.GetObject<object>("user");
}
catch (KeyNotFoundException)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
密钥"用户"不存在,所以我希望得到一个KeyNotFoundException.但是我从来没有看到过抛出这个异常.相反,它只是"挂起",永远不会从await GetObject调用返回.
我在Android 5.0手机上运行此功能.
任何想法如何解决这一问题?我做了一些根本错误的事吗?
更新:旁注:不是立即尝试GetObject,而是可以尝试检查密钥是否实际存在于缓存中,然后才从缓存中检索它.但是,如果我没有弄错的话,除了调用GetObject并捕获异常之外没有其他方法可以进行检查,就像上面的示例一样.对于一个人只想知道项目是否存在的情况,这似乎并不理想.也许在Akavache中使用"存在()"方法会很好吗?或许我错过了什么?
Update2:更改示例以在构造函数中不使用async方法.只是为了证明这不是问题.
Update3:从构造函数中删除调用.当我从代码中的任何地方调用BlockingGetExternalUser时,await仍会挂起.
我为JSON.NET设置了全局转换器默认值,如下所示:
var jsonSerializerSettings = new JsonSerializerSettings
{
Converters = new JsonConverter[] { new QuestionTypeConverter() }
};
JsonConvert.DefaultSettings = () => jsonSerializerSettings;
Run Code Online (Sandbox Code Playgroud)
这适用于我的其余代码("QuestionTypeConverter"正在使用并按预期工作),但是,当从Akavache缓存中检索对象时,我的"QuestionTypeConverter"被忽略,因此我的对象无法正确反序列化.如何使用Akavache强制使用我的自定义类型转换器,或者让Akavache使用JSON.NET的默认设置?