コード例 #1
0
ファイル: PackHelpers.cs プロジェクト: ztittle/msgpack-cli
        public static void PackToMap <TObject>(
            Packer packer,
            TObject target,
            IDictionary <string, Action <Packer, TObject> > operations
            )
        {
            if (packer == null)
            {
                SerializationExceptions.ThrowArgumentNullException("packer");
            }

            if (operations == null)
            {
                SerializationExceptions.ThrowArgumentNullException("operations");
            }

            var parameter =
                new PackToMapParameters <TObject>
            {
                Packer     = packer,
                Target     = target,
                Operations = operations
            };

            PackToMap(ref parameter);
        }
コード例 #2
0
ファイル: PackHelpers.cs プロジェクト: ztittle/msgpack-cli
        public static void PackToMap <TObject>(
            ref PackToMapParameters <TObject> parameter
            )
        {
            if (parameter.Packer == null)
            {
                SerializationExceptions.ThrowArgumentNullException("parameter", "Packer");
            }

            if (parameter.Operations == null)
            {
                SerializationExceptions.ThrowArgumentNullException("parameter", "Operations");
            }

#if ASSERT
            Contract.Assert(parameter.Packer != null);
            Contract.Assert(parameter.Operations != null);
#endif // ASSERT

            if (parameter.NullCheckers != null &&
                parameter.SerializationContext != null && parameter.SerializationContext.DictionarySerlaizationOptions.OmitNullEntry)
            {
#if ASSERT
                Contract.Assert(!SerializerDebugging.UseLegacyNullMapEntryHandling);
#endif // ASSERT

                // Skipping causes the entries count header reducing, so count up null entries first.
                var nullCount = 0;
                foreach (var nullChecker in parameter.NullCheckers)
                {
                    if (nullChecker.Value(parameter.Target))
                    {
                        nullCount++;
                    }
                }

                parameter.Packer.PackMapHeader(parameter.Operations.Count - nullCount);
                foreach (var operation in parameter.Operations)
                {
                    Func <TObject, bool> nullChecker;
                    if (parameter.NullCheckers.TryGetValue(operation.Key, out nullChecker))
                    {
                        if (nullChecker(parameter.Target))
                        {
                            continue;
                        }
                    }

                    parameter.Packer.PackString(operation.Key);
                    operation.Value(parameter.Packer, parameter.Target);
                }
            }
            else
            {
                parameter.Packer.PackMapHeader(parameter.Operations.Count);
                // Compatible path
                foreach (var operation in parameter.Operations)
                {
                    parameter.Packer.PackString(operation.Key);
                    operation.Value(parameter.Packer, parameter.Target);
                }
            }
#pragma warning restore 618
        }