#region License // Copyright (c) 2007 James Newton-King // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace LC.Newtonsoft.Json.Serialization { /// /// A base class for resolving how property names and dictionary keys are serialized. /// public abstract class NamingStrategy { /// /// A flag indicating whether dictionary keys should be processed. /// Defaults to false. /// public bool ProcessDictionaryKeys { get; set; } /// /// A flag indicating whether extension data names should be processed. /// Defaults to false. /// public bool ProcessExtensionDataNames { get; set; } /// /// A flag indicating whether explicitly specified property names, /// e.g. a property name customized with a , should be processed. /// Defaults to false. /// public bool OverrideSpecifiedNames { get; set; } /// /// Gets the serialized name for a given property name. /// /// The initial property name. /// A flag indicating whether the property has had a name explicitly specified. /// The serialized property name. public virtual string GetPropertyName(string name, bool hasSpecifiedName) { if (hasSpecifiedName && !OverrideSpecifiedNames) { return name; } return ResolvePropertyName(name); } /// /// Gets the serialized name for a given extension data name. /// /// The initial extension data name. /// The serialized extension data name. public virtual string GetExtensionDataName(string name) { if (!ProcessExtensionDataNames) { return name; } return ResolvePropertyName(name); } /// /// Gets the serialized key for a given dictionary key. /// /// The initial dictionary key. /// The serialized dictionary key. public virtual string GetDictionaryKey(string key) { if (!ProcessDictionaryKeys) { return key; } return ResolvePropertyName(key); } /// /// Resolves the specified property name. /// /// The property name to resolve. /// The resolved property name. protected abstract string ResolvePropertyName(string name); /// /// Hash code calculation /// /// public override int GetHashCode() { unchecked { var hashCode = GetType().GetHashCode(); // make sure different types do not result in equal values hashCode = (hashCode * 397) ^ ProcessDictionaryKeys.GetHashCode(); hashCode = (hashCode * 397) ^ ProcessExtensionDataNames.GetHashCode(); hashCode = (hashCode * 397) ^ OverrideSpecifiedNames.GetHashCode(); return hashCode; } } /// /// Object equality implementation /// /// /// public override bool Equals(object obj) => Equals(obj as NamingStrategy); /// /// Compare to another NamingStrategy /// /// /// protected bool Equals(NamingStrategy other) { if (other == null) { return false; } return GetType() == other.GetType() && ProcessDictionaryKeys == other.ProcessDictionaryKeys && ProcessExtensionDataNames == other.ProcessExtensionDataNames && OverrideSpecifiedNames == other.OverrideSpecifiedNames; } } }