From a471f134882be98eaf8131d81c8fa17d596fb0dd Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 29 Jun 2021 19:02:46 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91=E9=9D=9E?= =?UTF-8?q?=E5=A4=9A=E6=80=81bean=E7=B1=BB=E5=9E=8B=E4=B9=9F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8F=AF=E7=A9=BA=E3=80=82bean=E7=9A=84bin=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=A8=A1=E5=BC=8F=E4=B8=8B=E7=9A=84=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=B8=8E=E5=85=B6=E4=BB=96=E5=8E=9F=E7=94=9F=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=B8=80=E8=87=B4(=E5=BC=BA=E8=BF=AB=E5=85=88bool=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E6=98=AF=E5=90=A6=E4=B8=BA=EF=BC=8C=E5=86=8D=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5)=EF=BC=8C?= =?UTF-8?q?=E4=B9=9F=E8=B0=83=E6=95=B4excel=E8=AF=86=E5=88=AB=E9=9D=9E?= =?UTF-8?q?=E5=A4=9A=E6=80=81bean=E7=B1=BB=E5=9E=8B=E7=9A=84=E5=8A=9E?= =?UTF-8?q?=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/Datas/test/test_null.xlsx | Bin 0 -> 9188 bytes config/Defines/test.xml | 11 +++++++++ src/Luban.Job.Cfg/Luban.Job.Cfg.csproj | 4 +++ .../Source/DataVisitors/BinaryExportor.cs | 15 ++++++------ .../Source/DataVisitors/ValidatorVisitor.cs | 2 +- src/Luban.Job.Cfg/Source/Defs/DefBean.cs | 3 +++ .../Source/Defs/TTypeTemplateExtends.cs | 2 +- .../Source/Generate/CppBinCodeRender.cs | 1 - .../Source/Generate/CsBinCodeRender.cs | 1 - .../Source/TypeVisitors/ExcelDataCreator.cs | 20 +++++++++++++-- .../TypeVisitors/ExcelNamedRowDataCreator.cs | 23 ++++++++++++++++-- .../Source/Defs/TTypeTemplateCommonExtends.cs | 2 +- .../TypeVisitors/CsDeserializeVisitor.cs | 8 +++--- .../NeedMarshalBoolPrefixVisitor.cs | 16 ++++++------ src/Luban.Job.Common/Source/Types/TBean.cs | 3 +-- 15 files changed, 80 insertions(+), 31 deletions(-) create mode 100644 config/Datas/test/test_null.xlsx diff --git a/config/Datas/test/test_null.xlsx b/config/Datas/test/test_null.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3e79a4e7076849342cf12266c5f28760a9c99b88 GIT binary patch literal 9188 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 dfAkml9}!Yb5ec@t0027d7YGw>73!b={tty= + + + + + + + + +
+ @@ -199,4 +209,5 @@
+ \ No newline at end of file diff --git a/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj b/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj index b269046..edfff9c 100644 --- a/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj +++ b/src/Luban.Job.Cfg/Luban.Job.Cfg.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/BinaryExportor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/BinaryExportor.cs index 4927196..66fe3d6 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/BinaryExportor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/BinaryExportor.cs @@ -94,12 +94,12 @@ namespace Luban.Job.Cfg.DataVisitors var bean = type.Type; if (bean.IsAbstractType) { - // null 时特殊处理 - if (type.ImplType == null) - { - x.WriteInt(0); - return; - } + // 调整设计后,多态bean不会为空 + //if (type.ImplType == null) + //{ + // x.WriteInt(0); + // return; + //} x.WriteInt(type.ImplType.Id); } int index = -1; @@ -111,8 +111,7 @@ namespace Luban.Job.Cfg.DataVisitors { continue; } - - if (defField.CType.Apply(NeedMarshalBoolPrefixVisitor.Ins)) + if (defField.CType.IsNullable) { if (field != null) { diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs index 8ef1d2a..72e2cec 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs @@ -113,7 +113,7 @@ namespace Luban.Job.Cfg.DataVisitors public void Accept(DBean record, DefAssembly assembly) { - if (record.ImplType == null) + if (record == null) { return; } diff --git a/src/Luban.Job.Cfg/Source/Defs/DefBean.cs b/src/Luban.Job.Cfg/Source/Defs/DefBean.cs index 1167453..0f2fd48 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefBean.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefBean.cs @@ -12,6 +12,9 @@ namespace Luban.Job.Cfg.Defs { public const string TYPE_NAME_KEY = "__type__"; + public const string BEAN_NULL_STR = "{null}"; + + public const string BEAN_NOT_NULL_STR = "{}"; public string Alias { get; } diff --git a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs index e3874bc..7965864 100644 --- a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs +++ b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs @@ -87,7 +87,7 @@ namespace Luban.Job.Cfg.Defs { var name = field.CsStyleName; TType type = field.CType; - if (field.CType.Apply(NeedMarshalBoolPrefixVisitor.Ins)) + if (field.CType.IsNullable) { return $"{{ var _exists bool; if _exists, err = {bufName}.ReadBool(); err != nil {{ return }}; if _exists {{ if _v.{name}, err = {type.Apply(GoDeserializeVisitor.Ins, bufName)}; err != nil {{ return }} }} }}"; } diff --git a/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs index 172f904..a0ea147 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs @@ -233,7 +233,6 @@ namespace {{x.top_module}} if (!_buf.readInt(id)) return false; switch (id) { - case 0 : { _out = nullptr; return true; } {{- for child in type.hierarchy_not_abstract_children}} case {{child.cpp_full_name}}::ID: { _out = new {{child.cpp_full_name}}(); if (_out->deserialize(_buf)) { return true; } else { delete _out; _out = nullptr; return false;} } {{-end}} diff --git a/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs index 855f2b3..9e2ecb9 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs @@ -59,7 +59,6 @@ public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} { {{if x.is_abstract_type}} switch (_buf.ReadInt()) { - case 0 : return null; {{- for child in x.hierarchy_not_abstract_children}} case {{child.full_name}}.ID: return new {{child.full_name}}(_buf); {{-end}} diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelDataCreator.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelDataCreator.cs index 681cee2..2a53971 100644 --- a/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelDataCreator.cs @@ -327,9 +327,13 @@ namespace Luban.Job.Cfg.TypeVisitors if (originBean.IsAbstractType) { string subType = x.Read().ToString(); - if (subType.ToLower().Trim() == "null") + if (subType.ToLower().Trim() == DefBean.BEAN_NULL_STR) { - return new DBean(originBean, null, null); + if (!type.IsNullable) + { + throw new InvalidExcelDataException($"type:{type.Bean.FullName}不是可空类型. 不能为空"); + } + return null; } string fullType = TypeUtil.MakeFullName(originBean.Namespace, subType); DefBean implType = (DefBean)originBean.GetNotAbstractChildType(subType); @@ -341,6 +345,18 @@ namespace Luban.Job.Cfg.TypeVisitors } else { + if (type.IsNullable) + { + string subType = x.Read().ToString().Trim(); + if (subType == DefBean.BEAN_NULL_STR) + { + return null; + } + else if (subType != DefBean.BEAN_NOT_NULL_STR) + { + throw new Exception($"type:{type.Bean.FullName} 可空标识 不合法(只能为{DefBean.BEAN_NOT_NULL_STR}或{DefBean.BEAN_NULL_STR})"); + } + } return new DBean(originBean, originBean, CreateBeanFields(originBean, x, ass)); } } diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelNamedRowDataCreator.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelNamedRowDataCreator.cs index 0c7bf7b..2f4be6e 100644 --- a/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelNamedRowDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/ExcelNamedRowDataCreator.cs @@ -2,6 +2,7 @@ using Luban.Common.Utils; using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.DataSources.Excel; using Luban.Job.Cfg.Defs; +using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Common.Types; using Luban.Job.Common.TypeVisitors; using System; @@ -175,15 +176,20 @@ namespace Luban.Job.Cfg.TypeVisitors return list; } + public DType Accept(TBean type, Sheet.NamedRow row, bool multirow, bool nullable) { var originBean = (DefBean)type.Bean; if (originBean.IsAbstractType) { string subType = row.GetColumn(DefBean.TYPE_NAME_KEY, null, true).Read().ToString().Trim(); - if (subType.ToLower() == "null") + if (subType.ToLower() == DefBean.BEAN_NULL_STR) { - return new DBean(originBean, null, null); + if (!type.IsNullable) + { + throw new Exception($"type:{type} 不是可空类型 {type.Bean.FullName}? , 不能为空"); + } + return null; } string fullType = TypeUtil.MakeFullName(originBean.Namespace, subType); DefBean implType = (DefBean)originBean.GetNotAbstractChildType(subType); @@ -195,6 +201,19 @@ namespace Luban.Job.Cfg.TypeVisitors } else { + if (type.IsNullable) + { + string subType = row.GetColumn(DefBean.TYPE_NAME_KEY, null, true).Read().ToString().Trim(); + if (subType == DefBean.BEAN_NULL_STR) + { + return null; + } + else if (subType != DefBean.BEAN_NOT_NULL_STR) + { + throw new Exception($"type:{type.Bean.FullName} {DefBean.TYPE_NAME_KEY} 不合法(只能为{DefBean.BEAN_NOT_NULL_STR}或{DefBean.BEAN_NULL_STR})"); + } + } + return new DBean(originBean, originBean, CreateBeanFields(originBean, row)); } } diff --git a/src/Luban.Job.Common/Source/Defs/TTypeTemplateCommonExtends.cs b/src/Luban.Job.Common/Source/Defs/TTypeTemplateCommonExtends.cs index 2116ae3..af1490e 100644 --- a/src/Luban.Job.Common/Source/Defs/TTypeTemplateCommonExtends.cs +++ b/src/Luban.Job.Common/Source/Defs/TTypeTemplateCommonExtends.cs @@ -13,7 +13,7 @@ namespace Luban.Job.Common.Defs public static bool NeedMarshalBoolPrefix(TType type) { - return type.Apply(NeedMarshalBoolPrefixVisitor.Ins); + return type.IsNullable; } public static bool CsNeedInit(TType type) diff --git a/src/Luban.Job.Common/Source/TypeVisitors/CsDeserializeVisitor.cs b/src/Luban.Job.Common/Source/TypeVisitors/CsDeserializeVisitor.cs index 7861796..f52514d 100644 --- a/src/Luban.Job.Common/Source/TypeVisitors/CsDeserializeVisitor.cs +++ b/src/Luban.Job.Common/Source/TypeVisitors/CsDeserializeVisitor.cs @@ -19,9 +19,9 @@ namespace Luban.Job.Common.TypeVisitors } } - public override string Accept(TBean type, string bufName, string fieldName) - { - return type.Apply(CsUnderingDeserializeVisitor.Ins, bufName, fieldName); - } + //public override string Accept(TBean type, string bufName, string fieldName) + //{ + // return type.Apply(CsUnderingDeserializeVisitor.Ins, bufName, fieldName); + //} } } diff --git a/src/Luban.Job.Common/Source/TypeVisitors/NeedMarshalBoolPrefixVisitor.cs b/src/Luban.Job.Common/Source/TypeVisitors/NeedMarshalBoolPrefixVisitor.cs index 6a85626..e7bc370 100644 --- a/src/Luban.Job.Common/Source/TypeVisitors/NeedMarshalBoolPrefixVisitor.cs +++ b/src/Luban.Job.Common/Source/TypeVisitors/NeedMarshalBoolPrefixVisitor.cs @@ -2,13 +2,13 @@ using Luban.Job.Common.Types; namespace Luban.Job.Common.TypeVisitors { - public class NeedMarshalBoolPrefixVisitor : DecoratorFuncVisitor - { - public static NeedMarshalBoolPrefixVisitor Ins { get; } = new NeedMarshalBoolPrefixVisitor(); + //public class NeedMarshalBoolPrefixVisitor : DecoratorFuncVisitor + //{ + // //public static NeedMarshalBoolPrefixVisitor Ins { get; } = new NeedMarshalBoolPrefixVisitor(); - public override bool DoAccept(TType type) - { - return type.IsNullable && !(type is TBean bean && bean.IsDynamic); - } - } + // public override bool DoAccept(TType type) + // { + // return type.IsNullable && !(type is TBean bean && bean.IsDynamic); + // } + //} } diff --git a/src/Luban.Job.Common/Source/Types/TBean.cs b/src/Luban.Job.Common/Source/Types/TBean.cs index de09636..789f0e4 100644 --- a/src/Luban.Job.Common/Source/Types/TBean.cs +++ b/src/Luban.Job.Common/Source/Types/TBean.cs @@ -10,8 +10,7 @@ namespace Luban.Job.Common.Types public T GetBeanAs() where T : DefBeanBase => (T)Bean; - // TODO bean 允许指定是否可空 - public TBean(DefBeanBase defBean, bool isNullable) : base(defBean.IsAbstractType) + public TBean(DefBeanBase defBean, bool isNullable) : base(isNullable) { this.Bean = defBean; }