Selaa lähdekoodia

加入共用的序列化類別(支援JSON, TOML, YAML, XML)

0x0001F36D 5 vuotta sitten
vanhempi
commit
558d52275f

+ 12 - 0
src/Yuuna.Common/Serialization/ISerializer.cs

@@ -0,0 +1,12 @@
+namespace Yuuna.Common.Serialization
+{
+    using Newtonsoft.Json;
+    using System.IO;
+
+    public interface ISerializer
+    {
+        bool TryDeserialize<T>(TextReader reader, out T result);
+
+        bool TrySerialize<T>(TextWriter writer, T graph);
+    }
+}

+ 20 - 0
src/Yuuna.Common/Serialization/JsonSerializer.cs

@@ -0,0 +1,20 @@
+
+
+namespace Yuuna.Common.Serialization
+{
+    using System.IO;
+    using Newtonsoft.Json;
+
+    internal sealed class JsonSerializer : Serializer
+    {
+        protected override T OnDeserialize<T>(TextReader reader)
+        {
+            return JsonConvert.DeserializeObject<T>(reader.ReadToEnd());
+        }
+
+        protected override void OnSerialize<T>(TextWriter writer, T graph)
+        {
+            writer.Write(JsonConvert.SerializeObject(graph));
+        }
+    }
+}

+ 44 - 0
src/Yuuna.Common/Serialization/Serializer.cs

@@ -0,0 +1,44 @@
+
+namespace Yuuna.Common.Serialization
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Text;
+
+    public abstract class Serializer : ISerializer
+    {
+        public bool TryDeserialize<T>(TextReader reader, out T result)
+        {
+            try
+            {
+                result = this.OnDeserialize<T>(reader);
+                return true;
+            }
+            catch
+            {
+                result = default;
+                return false;
+            }
+        }
+
+        protected abstract T OnDeserialize<T>(TextReader reader);
+
+        public bool TrySerialize<T>(TextWriter writer, T graph)
+        {
+            try
+            {
+                this.OnSerialize<T>(writer, graph);
+                return true;
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        protected abstract void OnSerialize<T>(TextWriter writer, T graph);
+
+
+    }
+}

+ 11 - 0
src/Yuuna.Common/Serialization/Serializers.cs

@@ -0,0 +1,11 @@
+
+namespace Yuuna.Common.Serialization
+{
+    public static class Serializers
+    {
+        public readonly static ISerializer Json = new JsonSerializer();
+        public readonly static ISerializer Toml = new TomlSerializer();
+        public readonly static ISerializer Yaml = new YamlSerializer();
+        public readonly static ISerializer Xml = new XmlSerializer();
+    }
+}

+ 22 - 0
src/Yuuna.Common/Serialization/TomlSerializer.cs

@@ -0,0 +1,22 @@
+
+
+
+
+namespace Yuuna.Common.Serialization
+{
+    using System.IO;
+    using Nett;
+
+    internal sealed class TomlSerializer : Serializer
+    {
+        protected override T OnDeserialize<T>(TextReader reader)
+        {
+            return Toml.ReadString<T>(reader.ReadToEnd());
+        }
+
+        protected override void OnSerialize<T>(TextWriter writer, T graph)
+        {
+            writer.Write(Toml.WriteString(graph));
+        }
+    }
+}

+ 24 - 0
src/Yuuna.Common/Serialization/XmlSerializer.cs

@@ -0,0 +1,24 @@
+
+namespace Yuuna.Common.Serialization
+{
+    using System.IO;
+    using System.Xml;
+
+    internal sealed class XmlSerializer : Serializer
+    {
+        protected override T OnDeserialize<T>(TextReader reader)
+        {
+            var xdoc = new XmlDocument(); 
+            xdoc.LoadXml(reader.ReadToEnd());
+            var x = new XmlNodeReader(xdoc.DocumentElement);
+            var ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
+            var obj = ser.Deserialize(x);
+            return (T)obj;
+        }
+        protected override void OnSerialize<T>(TextWriter writer, T graph)
+        {
+            var ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
+            ser.Serialize(writer, graph);
+        }
+    }
+}

+ 23 - 0
src/Yuuna.Common/Serialization/YamlSerializer.cs

@@ -0,0 +1,23 @@
+
+
+
+namespace Yuuna.Common.Serialization
+{
+    using System.IO;
+
+    internal sealed class YamlSerializer : Serializer
+    {
+        
+        protected override T OnDeserialize<T>(TextReader reader)
+        {
+            var deserializer = new YamlDotNet.Serialization.Deserializer();
+            return deserializer.Deserialize<T>(reader.ReadToEnd());
+        }
+
+        protected override void OnSerialize<T>(TextWriter writer, T graph)
+        {
+            var serializer = new YamlDotNet.Serialization.Serializer();
+            writer.Write(serializer.Serialize(graph));
+        }
+    }
+}

+ 7 - 1
src/Yuuna.Common/Yuuna.Common.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
@@ -7,4 +7,10 @@
     <StartupObject />
   </PropertyGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Nett" Version="0.13.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+    <PackageReference Include="YamlDotNet" Version="8.0.0" />
+  </ItemGroup>
+
 </Project>

+ 0 - 66
src/Yuuna.Contracts.Test/ViewService.cs

@@ -1,66 +0,0 @@
-
-namespace Yuuna.Contracts.Test
-{
-    using Microsoft.AspNetCore;
-    using Microsoft.AspNetCore.Builder;
-    using Microsoft.AspNetCore.Hosting;
-    using Microsoft.AspNetCore.Http;
-    using Microsoft.AspNetCore.Routing;
-    using Microsoft.Extensions.DependencyInjection;
-    using System;
-    using System.Collections.Concurrent;
-    using System.Collections.Generic;
-    using System.Text;
-    using System.Threading.Tasks;
-    using Yuuna.Contracts.Interaction;
-
-    public class ViewService : IInteractiveView2
-    {
-        private ConcurrentQueue<string> _taskQueue;
-
-        public ViewService()
-        {
-            this._taskQueue = new ConcurrentQueue<string>();
-
-            WebHost
-                .CreateDefaultBuilder()
-                .UseStartup<Startup>()
-                .Build()
-                .Run();
-        }
-        public Response Request(string text)
-        {
-            //接收到從客戶端來的文字
-            return null;
-        } 
-    }
-
-    public class Startup
-    {
-        public void ConfigureServices(IServiceCollection services)
-        {
-            services.AddRouting();
-        }
-        public void Configure(IApplicationBuilder app)
-        {
-            var defaultRouteHandler = new RouteHandler(context =>
-            {
-                var routeValues = context.GetRouteData().Values;
-                return context.Response.WriteAsync($"Route values: {string.Join(", ", routeValues)}");
-            });
-
-            var routeBuilder = new RouteBuilder(app, defaultRouteHandler);
-            routeBuilder.MapRoute("default", "{first:regex(^(default|home)$)}/{second?}");
-            
-            routeBuilder.MapPost("user/{text}", context => {
-                var text = context.GetRouteValue("text");
-                return context.Response.WriteAsync($"Create user. name: {name}");
-            });
-
-            var routes = routeBuilder.Build();
-            app.UseRouter(routes);
-        }
-
-
-    } 
-}

+ 4 - 22
src/Yuuna/EntryPoint.cs

@@ -14,35 +14,17 @@ namespace Yuuna
     using Microsoft.AspNetCore.Mvc;
     using Microsoft.Extensions.Logging;
     using Yuuna.Contracts.Optimization;
-    using Yuuna.Interaction.AspNetCore;
-    using RestSharp;
+    using Yuuna.Interaction.AspNetCore; 
     using Yuuna.TextSegmention;
     using Yuuna.Contracts.Interaction;
+    using Yuuna.Common.Serialization;
 
     internal class EntryPoint
     { 
         public static async Task Main(string[] args)
         {
-            //await WebHost.RunAsync();
-            var actor = new Actor(new JiebaTextSegmenter(), new Response[]
-            {
-                (Moods.Sad, "我不清楚你想做什麼 OvQ"),
-                (Moods.Sad, "我不懂你想幹嘛 QAQ"),
-                (Moods.Sad, "我不知道你想幹嘛 OHQ"),
-            }, new Strategy(), ModuleManager.Instance.Modules);
-
-            while (true)
-            {
-                Console.Write("Me:  ");
-                if (actor.Accept(Console.ReadLine(), out var response))
-                {
-                    Console.WriteLine("Bot: " + response.Message);
-                }
-                else
-                {
-                    Console.CursorTop--;
-                }
-            }
+            await WebHost.RunAsync();
+             
 
             //while (true)
             //{

+ 1 - 2
src/Yuuna/Yuuna.csproj

@@ -15,10 +15,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
+    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0-preview3-35497" />
     <PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
     <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" />
-    <PackageReference Include="RestSharp" Version="106.10.0" />
   </ItemGroup>
 
   <ItemGroup>