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); }
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 }