chore: 将 json 序列化工具提出来
parent
45cb4a14c3
commit
1c70bda35c
|
@ -0,0 +1,37 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace LeanCloud.Common {
|
||||||
|
public class LCJsonConverter : JsonConverter {
|
||||||
|
public override bool CanConvert(Type objectType) {
|
||||||
|
return objectType == typeof(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
|
||||||
|
serializer.Serialize(writer, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
|
||||||
|
if (reader.TokenType == JsonToken.StartObject) {
|
||||||
|
var obj = new Dictionary<string, object>();
|
||||||
|
serializer.Populate(reader, obj);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
if (reader.TokenType == JsonToken.StartArray) {
|
||||||
|
var arr = new List<object>();
|
||||||
|
serializer.Populate(reader, arr);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
if (reader.TokenType == JsonToken.Integer) {
|
||||||
|
if ((long)reader.Value < int.MaxValue) {
|
||||||
|
return Convert.ToInt32(reader.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return serializer.Deserialize(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly static LCJsonConverter Default = new LCJsonConverter();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
using System;
|
||||||
|
namespace LiveQuery.Internal {
|
||||||
|
public class LCLiveQueryHeartBeat {
|
||||||
|
public LCLiveQueryHeartBeat() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
using System;
|
||||||
|
namespace LiveQuery {
|
||||||
|
public class LCQueryExtension {
|
||||||
|
public LCQueryExtension() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,9 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace LiveQueryApp {
|
||||||
|
class Program {
|
||||||
|
static void Main(string[] args) {
|
||||||
|
Console.WriteLine("Hello World!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace RealtimeApp {
|
||||||
|
/// <summary>
|
||||||
|
/// 单线程环境,用于控制台应用 await 返回
|
||||||
|
/// </summary>
|
||||||
|
public class SingleThreadSynchronizationContext : SynchronizationContext {
|
||||||
|
private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> queue = new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
|
||||||
|
|
||||||
|
public override void Post(SendOrPostCallback d, object state) {
|
||||||
|
queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RunOnCurrentThread() {
|
||||||
|
while (queue.TryTake(out KeyValuePair<SendOrPostCallback, object> workItem, Timeout.Infinite)) {
|
||||||
|
workItem.Key(workItem.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Complete() {
|
||||||
|
queue.CompleteAdding();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Run(Func<Task> func) {
|
||||||
|
SynchronizationContext prevContext = Current;
|
||||||
|
try {
|
||||||
|
SingleThreadSynchronizationContext syncContext = new SingleThreadSynchronizationContext();
|
||||||
|
SetSynchronizationContext(syncContext);
|
||||||
|
|
||||||
|
Task t = func();
|
||||||
|
syncContext.RunOnCurrentThread();
|
||||||
|
|
||||||
|
t.GetAwaiter().GetResult();
|
||||||
|
} finally {
|
||||||
|
SetSynchronizationContext(prevContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue