protected void WriteAny(object obj) { var t = obj.GetType(); WriteRoughType(t); GetWriteFunc(t)(obj); }
private void WriteUnknown(object obj) { if (obj == null) { writer.Write(nullBytes); return; } var u = (YuzuUnknown)obj; writer.Write((byte)'{'); WriteFieldSeparator(); objStack.Push(obj); try { depth += 1; var isFirst = true; WriteName(JsonOptions.ClassTag, ref isFirst); WriteUnescapedString(u.ClassTag); foreach (var f in u.Fields) { WriteName(f.Key, ref isFirst); GetWriteFunc(f.Value.GetType())(f.Value); } if (!isFirst) { WriteFieldSeparator(); } } finally { depth -= 1; objStack.Pop(); } WriteIndent(); writer.Write((byte)'}'); }
// List<object> private void WriteAny(object obj) { var t = obj.GetType(); if (t == typeof(object)) { throw new YuzuException("WriteAny of unknown type"); } if (IsUserObject(t)) { var meta = Meta.Get(t, Options); var sg = meta.Surrogate; Action <object> surrogateWriter = GetSurrogateWriter(meta); if (sg.FuncTo == null || (sg.FuncIf != null && !sg.FuncIf(obj))) { // Ignore compact since class name is always required. WriteObject(obj, null, null); } else { surrogateWriter(sg.FuncTo(obj)); } } else { GetWriteFunc(t)(obj); } }
private void WriteObjectCompactOneline(object obj, Meta meta) { if (obj == null) { writer.Write(nullBytes); return; } var actualType = obj.GetType(); if (meta.Type != actualType) { throw new YuzuException(String.Format( "Attempt to write compact type {0} instead of {1}", actualType.Name, meta.Type.Name)); } meta.BeforeSerialization.Run(obj); writer.Write((byte)'['); var isFirst = true; objStack.Push(obj); try { foreach (var yi in meta.Items) { if (!isFirst) { writer.Write((byte)','); } isFirst = false; GetWriteFunc(yi.Type)(yi.GetValue(obj)); } } finally { objStack.Pop(); }; writer.Write((byte)']'); }
protected void WriteAny(object obj) { var t = obj.GetType(); if (t == typeof(object)) { throw new YuzuException("WriteAny of unknown type"); } WriteRoughType(t); GetWriteFunc(t)(obj); }
protected void WriteAny(object obj) { if (obj == null) { writer.Write((byte)RoughType.Any); return; } var t = obj.GetType(); if (t == typeof(object)) { throw new YuzuException("WriteAny of unknown type"); } WriteRoughType(t); GetWriteFunc(t)(obj); }
protected void WriteRecord(object obj) => GetWriteFunc(obj.GetType())(obj);
protected override void ToWriter(object obj) => GetWriteFunc(obj.GetType())(obj);
private void WriteUnknownStorageItem(YuzuUnknownStorage.Item item, ref bool isFirst) { WriteName(item.Name, ref isFirst); GetWriteFunc(item.Value.GetType())(item.Value); }
private void WriteObject(object obj, Meta meta) { if (obj == null) { writer.Write(nullBytes); return; } var expectedType = meta == null ? null : meta.Type; var actualType = obj.GetType(); if (meta == null || meta.Type != actualType) { meta = Meta.Get(actualType, Options); } meta.BeforeSerialization.Run(obj); writer.Write((byte)'{'); WriteFieldSeparator(); objStack.Push(obj); try { depth += 1; var isFirst = true; if ( expectedType != actualType || objStack.Count == 1 && JsonOptions.SaveRootClass || meta.WriteAlias != null ) { WriteName(JsonOptions.ClassTag, ref isFirst); WriteUnescapedString(meta.WriteAlias ?? TypeSerializer.Serialize(actualType)); } var storage = meta.GetUnknownStorage == null ? null : meta.GetUnknownStorage(obj); // Duplicate code to optimize fast-path without unknown storage. if (storage == null || storage.Fields.Count == 0 || JsonOptions.Unordered) { foreach (var yi in meta.Items) { var value = yi.GetValue(obj); if (yi.SerializeIf != null && !yi.SerializeIf(obj, value)) { continue; } WriteName(yi.Tag(Options), ref isFirst); GetWriteFunc(yi.Type)(value); } // If Unordered, dump all unknown fields after all known ones. if (storage != null) { for (var storageIndex = 0; storageIndex < storage.Fields.Count; ++storageIndex) { WriteUnknownStorageItem(storage.Fields[storageIndex], ref isFirst); } } } else { // Merge unknown and known fields. storage.Sort(); var storageIndex = 0; foreach (var yi in meta.Items) { var value = yi.GetValue(obj); if (yi.SerializeIf != null && !yi.SerializeIf(obj, value)) { continue; } var name = yi.Tag(Options); for (; storageIndex < storage.Fields.Count; ++storageIndex) { var si = storage.Fields[storageIndex]; if (String.CompareOrdinal(si.Name, name) >= 0) { break; } WriteUnknownStorageItem(si, ref isFirst); } WriteName(name, ref isFirst); GetWriteFunc(yi.Type)(value); } for (; storageIndex < storage.Fields.Count; ++storageIndex) { WriteUnknownStorageItem(storage.Fields[storageIndex], ref isFirst); } } if (!isFirst) { WriteFieldSeparator(); } } finally { depth -= 1; objStack.Pop(); } WriteIndent(); writer.Write((byte)'}'); }