Esempio n. 1
0
        protected void WriteAny(object obj)
        {
            var t = obj.GetType();

            WriteRoughType(t);
            GetWriteFunc(t)(obj);
        }
Esempio n. 2
0
        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)'}');
        }
Esempio n. 3
0
        // 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);
            }
        }
Esempio n. 4
0
        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)']');
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
 protected void WriteRecord(object obj) => GetWriteFunc(obj.GetType())(obj);
Esempio n. 8
0
 protected override void ToWriter(object obj) => GetWriteFunc(obj.GetType())(obj);
Esempio n. 9
0
 private void WriteUnknownStorageItem(YuzuUnknownStorage.Item item, ref bool isFirst)
 {
     WriteName(item.Name, ref isFirst);
     GetWriteFunc(item.Value.GetType())(item.Value);
 }
Esempio n. 10
0
        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)'}');
        }