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" },