diff --git a/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj b/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj index 5bb10fb..7ce5e67 100644 --- a/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj +++ b/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Luban.Job.Cfg/Source/DataExporters/BsonExportor.cs b/src/Luban.Job.Cfg/Source/DataExporters/BsonExportor.cs new file mode 100644 index 0000000..21446c0 --- /dev/null +++ b/src/Luban.Job.Cfg/Source/DataExporters/BsonExportor.cs @@ -0,0 +1,203 @@ +using Luban.Job.Cfg.Datas; +using Luban.Job.Cfg.DataSources; +using Luban.Job.Cfg.DataVisitors; +using Luban.Job.Cfg.Defs; +using Luban.Job.Cfg.Utils; +using Newtonsoft.Json.Bson; +using System; +using System.Collections.Generic; +using System.Text.Json; + +namespace Luban.Job.Cfg.DataExporters +{ + class BsonExportor : IDataActionVisitor + { + public static BsonExportor Ins { get; } = new BsonExportor(); + + public void WriteAsArray(List datas, BsonDataWriter x) + { + x.WriteStartArray(); + foreach (var d in datas) + { + d.Data.Apply(this, x); + } + x.WriteEndArray(); + } + + public void Accept(DBool type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DByte type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DShort type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DFshort type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DInt type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DFint type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DLong type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DFlong type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DFloat type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DDouble type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public virtual void Accept(DEnum type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DString type, BsonDataWriter x) + { + x.WriteValue(type.Value); + } + + public void Accept(DBytes type, BsonDataWriter x) + { + throw new NotImplementedException(); + } + + public virtual void Accept(DText type, BsonDataWriter x) + { + x.WriteStartObject(); + x.WritePropertyName(DText.KEY_NAME); + x.WriteValue(type.Key); + x.WritePropertyName(DText.TEXT_NAME); + x.WriteValue(type.TextOfCurrentAssembly); + x.WriteEndObject(); + } + + public virtual void Accept(DBean type, BsonDataWriter x) + { + x.WriteStartObject(); + + if (type.Type.IsAbstractType) + { + x.WritePropertyName(DefBean.JSON_TYPE_NAME_KEY); + x.WriteValue(DataUtil.GetImplTypeName(type)); + } + + var defFields = type.ImplType.HierarchyFields; + int index = 0; + foreach (var d in type.Fields) + { + var defField = (DefField)defFields[index++]; + + // 特殊处理 bean 多态类型 + // 另外,不生成 xxx:null 这样 + if (d == null || !defField.NeedExport) + { + //x.WriteNullValue(); + } + else + { + x.WritePropertyName(defField.Name); + d.Apply(this, x); + } + } + x.WriteEndObject(); + } + + public void WriteList(List datas, BsonDataWriter x) + { + x.WriteStartArray(); + foreach (var d in datas) + { + d.Apply(this, x); + } + x.WriteEndArray(); + } + + public void Accept(DArray type, BsonDataWriter x) + { + WriteList(type.Datas, x); + } + + public void Accept(DList type, BsonDataWriter x) + { + WriteList(type.Datas, x); + } + + public void Accept(DSet type, BsonDataWriter x) + { + WriteList(type.Datas, x); + } + + public virtual void Accept(DMap type, BsonDataWriter x) + { + x.WriteStartArray(); + foreach (var d in type.Datas) + { + x.WriteStartArray(); + d.Key.Apply(this, x); + d.Value.Apply(this, x); + x.WriteEndArray(); + } + x.WriteEndArray(); + } + + public void Accept(DVector2 type, BsonDataWriter x) + { + x.WriteStartObject(); + x.WritePropertyName("x"); x.WriteValue(type.Value.X); + x.WritePropertyName("y"); x.WriteValue(type.Value.Y); + x.WriteEndObject(); + } + + public void Accept(DVector3 type, BsonDataWriter x) + { + x.WriteStartObject(); + x.WritePropertyName("x"); x.WriteValue(type.Value.X); + x.WritePropertyName("y"); x.WriteValue(type.Value.Y); + x.WritePropertyName("z"); x.WriteValue(type.Value.Z); + x.WriteEndObject(); + } + + public void Accept(DVector4 type, BsonDataWriter x) + { + x.WriteStartObject(); + x.WritePropertyName("x"); x.WriteValue(type.Value.X); + x.WritePropertyName("y"); x.WriteValue(type.Value.Y); + x.WritePropertyName("z"); x.WriteValue(type.Value.Z); + x.WritePropertyName("w"); x.WriteValue(type.Value.W); + x.WriteEndObject(); + } + + public virtual void Accept(DDateTime type, BsonDataWriter x) + { + x.WriteValue(type.UnixTimeOfCurrentAssembly); + } + } +} diff --git a/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs b/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs index 0d70c40..3c07f7b 100644 --- a/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs @@ -10,6 +10,7 @@ namespace Luban.Job.Cfg.Generate [Render("data_bin")] [Render("data_json")] [Render("data_json2")] + [Render("data_bson")] [Render("data_lua")] [Render("data_xml")] [Render("data_yaml")] diff --git a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs index fd91a17..ea4fc5e 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs @@ -11,6 +11,7 @@ using Luban.Job.Common.Tpl; using Luban.Job.Common.Types; using Luban.Job.Common.Utils; using MessagePack; +using Newtonsoft.Json.Bson; using Scriban; using System; using System.Collections.Generic; @@ -79,6 +80,14 @@ namespace Luban.Job.Cfg.Utils tw.Flush(); return DataUtil.StreamToBytes(ms); } + case "data_bson": + { + var ss = new MemoryStream(); + var bsonWriter = new BsonDataWriter(ss); + BsonExportor.Ins.WriteAsArray(records, bsonWriter); + bsonWriter.Flush(); + return DataUtil.StreamToBytes(ss); + } case "data_xml": { var xwSetting = new XmlWriterSettings() { Indent = true }; diff --git a/src/Luban.Job.Common/Source/Utils/RenderFileUtil.cs b/src/Luban.Job.Common/Source/Utils/RenderFileUtil.cs index 29c7520..ea229ab 100644 --- a/src/Luban.Job.Common/Source/Utils/RenderFileUtil.cs +++ b/src/Luban.Job.Common/Source/Utils/RenderFileUtil.cs @@ -111,6 +111,7 @@ namespace Luban.Job.Common.Utils private static readonly Dictionary s_name2Suxxifx = new() { { "json", "json" }, + {"bson", "bson" }, { "lua", "lua" }, { "bin", "bytes" }, { "xml", "xml" },