CollectionSerializationBase

This commit is contained in:
ousttrue
2020-11-26 20:04:06 +09:00
parent 40c27f2ec4
commit 641ef08a6d
11 changed files with 941 additions and 488 deletions

View File

@@ -3,7 +3,7 @@ using System.IO;
namespace UniGLTF
{
public class ArraySerialization : SerializationBase
public class ArraySerialization : CollectionSerializationBase
{
IValueSerialization m_inner;
@@ -12,6 +12,7 @@ namespace UniGLTF
ValueType = t;
m_inner = inner;
}
public override void GenerateDeserializer(StreamWriter writer, string callName)
{
var itemCallName = callName + "_ITEM";

View File

@@ -0,0 +1,33 @@
using System;
using System.IO;
namespace UniGLTF
{
public abstract class CollectionSerializationBase : IValueSerialization
{
public Type ValueType
{
get;
protected set;
}
public bool IsInline
{
get { return false; }
}
public abstract void GenerateDeserializer(StreamWriter writer, string callName);
public string GenerateDeserializerCall(string callName, string argName)
{
return $"{callName}({argName})";
}
public abstract void GenerateSerializer(StreamWriter writer, string callName);
public string GenerateSerializerCall(string callName, string argName)
{
return $"{callName}(f, {argName})";
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 52a81be56b0149144aa0836e59d9bc3b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -3,7 +3,7 @@ using System.IO;
namespace UniGLTF
{
public class EnumIntSerialization : IValueSerialization
public class EnumSerialization : IValueSerialization
{
Type m_type;
EnumSerializationType m_serializationType;
@@ -24,7 +24,7 @@ namespace UniGLTF
}
public EnumIntSerialization(Type t, EnumSerializationType serializationType)
public EnumSerialization(Type t, EnumSerializationType serializationType)
{
m_type = t;
m_serializationType = serializationType;

View File

@@ -127,7 +127,7 @@ namespace UniGLTF
}
else if (t.IsEnum)
{
return new EnumIntSerialization(t, attr.EnumSerializationType);
return new EnumSerialization(t, attr.EnumSerializationType);
}
else if (t == typeof(glTFExtension))
{
@@ -164,5 +164,20 @@ namespace UniGLTF
return sb.ToString();
}
/// <summary>
/// Runtimeのシリアライズ判定関数を作る
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public string CreateSerializationCondition(Type t, string arg)
{
if (t.IsClass)
{
return $"{arg}!=null";
}
return "true";
}
}
}

View File

@@ -3,7 +3,7 @@ using System.IO;
namespace UniGLTF
{
public class ListSerialization : SerializationBase
public class ListSerialization : CollectionSerializationBase
{
IValueSerialization m_inner;

View File

@@ -5,35 +5,7 @@ using System.Text;
namespace UniGLTF
{
public abstract class SerializationBase : IValueSerialization
{
public Type ValueType
{
get;
protected set;
}
public bool IsInline
{
get { return false; }
}
public abstract void GenerateDeserializer(StreamWriter writer, string callName);
public string GenerateDeserializerCall(string callName, string argName)
{
return $"{callName}({argName})";
}
public abstract void GenerateSerializer(StreamWriter writer, string callName);
public string GenerateSerializerCall(string callName, string argName)
{
return $"{callName}(f, {argName})";
}
}
public class ObjectSerialization : SerializationBase
public class ObjectSerialization : CollectionSerializationBase
{
string m_path;
FieldSerializationInfo[] m_fsi;
@@ -111,6 +83,16 @@ public static $0 $2(ListTreeNode<JsonValue> parsed)
}
}
/// <summary>
/// シリアライザーのコード生成
///
/// ObjectのFieldのみ値によって、出力するか否かの判定が必用。
///
/// 例: 空文字列は出力しない
///
/// </summary>
/// <param name="writer"></param>
/// <param name="callName"></param>
public override void GenerateSerializer(StreamWriter writer, string callName)
{
writer.Write($@"
@@ -123,9 +105,13 @@ public static void {callName}(JsonFormatter f, {ValueType.Name} value)
foreach (var f in m_fsi)
{
writer.Write($" f.Key(\"{f.Name}\");\n");
writer.Write($" {f.Serialization.GenerateSerializerCall(f.FunctionName, $"value.{f.Name}")};\n");
writer.Write("\n");
var valueName = $"value.{f.Name}";
writer.Write($@"
if({f.CreateSerializationCondition(f.Serialization.ValueType, valueName)}){{
f.Key(""{f.Name}"");
{f.Serialization.GenerateSerializerCall(f.FunctionName, valueName)};
}}
");
}
writer.Write(@"

View File

@@ -3,7 +3,7 @@ using System.IO;
namespace UniGLTF
{
public class StringKeyDictionarySerialization : SerializationBase
public class StringKeyDictionarySerialization : CollectionSerializationBase
{
IValueSerialization m_inner;
@@ -12,6 +12,7 @@ namespace UniGLTF
ValueType = t;
m_inner = inner;
}
public override void GenerateDeserializer(StreamWriter writer, string callName)
{
var itemCallName = callName + "_ITEM";

View File

@@ -19,13 +19,13 @@ namespace UniGLTF
public static string ToJson(this glTFMesh self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_meshes_LIST(f, self);
GltfSerializer.Serialize_gltf_meshes_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFPrimitives self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_meshes__primitives_LIST(f, self);
GltfSerializer.Serialize_gltf_meshes__primitives_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFAttributes self)
@@ -43,19 +43,19 @@ namespace UniGLTF
public static string ToJson(this glTFMaterial self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_materials_LIST(f, self);
GltfSerializer.Serialize_gltf_materials_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFNode self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_nodes_LIST(f, self);
GltfSerializer.Serialize_gltf_nodes_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFSkin self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_skins_LIST(f, self);
GltfSerializer.Serialize_gltf_skins_ITEM(f, self);
return f.ToString();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -18,13 +18,13 @@ namespace VRM
public static string ToJson(this glTFMesh self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_meshes_LIST(f, self);
GltfSerializer.Serialize_gltf_meshes_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFPrimitives self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_meshes__primitives_LIST(f, self);
GltfSerializer.Serialize_gltf_meshes__primitives_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFAttributes self)
@@ -42,19 +42,19 @@ namespace VRM
public static string ToJson(this glTFMaterial self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_materials_LIST(f, self);
GltfSerializer.Serialize_gltf_materials_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFNode self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_nodes_LIST(f, self);
GltfSerializer.Serialize_gltf_nodes_ITEM(f, self);
return f.ToString();
}
public static string ToJson(this glTFSkin self)
{
var f = new JsonFormatter();
GltfSerializer.Serialize_gltf_skins_LIST(f, self);
GltfSerializer.Serialize_gltf_skins_ITEM(f, self);
return f.ToString();
}