Пример #1
0
        /// <summary>
        /// constructorDictに値を渡す時はISerializer#CreateDefaultConstructorDictionary関数の戻り値をベースにしたものを利用することを推奨します。
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="obj"></param>
        /// <param name="constructorDict">nullの場合はCreateDefaultConstructorDictionary()の戻り値が使用されます。</param>
        public void Serialize(TextWriter stream, object obj)
        {
            var(info, context) = CreateInfoAndContext(obj.GetType());
            var doneSerialized = _instanceCreator.Serialize(obj, info, context);

            if (doneSerialized)
            {
            }
            else if (obj is ISerializable)
            {
                var serializable = obj as ISerializable;
                serializable.GetObjectData(info, context);
            }
            else if (obj.GetType().GetCustomAttribute <System.SerializableAttribute>() != null ||
                     obj.GetType().IsStruct())
            {
                //System.SerializableAttributeが指定されていたら、publicまたはSerializeFieldなFieldを集計する
                foreach (var fieldInfo in obj.GetSerializedFieldEnumerable())
                {
                    info.AddValue(fieldInfo.FieldInfo.Name, fieldInfo.Value);
                }
            }
            else
            {
                Debug.LogWarning($"This type({obj.GetType().FullName}) don't serialize...");
            }

            //if (info.MemberCount <= 0) return;
            WriteTo(stream, info);
        }