Кто-нибудь знает ветку ServiceStack.Text, которая может сериализировать частных членов? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть набор классов, которые действуют как счетчики, где есть два уровня для представления классификаций. Где Ключ и Цифра никогда не публикуются публично, чтобы заставить любую реализацию работать с самим объектом класса с операторами, а не со свойствами Ключ и Цифра. Я использую ServiceStack для сериализации классов, в которые вложен этот EnumClass. Конечно, ServiceStack.Text, как есть, не поддерживает сериализацию частных членов, но мне было интересно, разработал ли кто-нибудь такую ​​ветку?

Пример кода для верхнего или родительского уровня:

[Serializable]
public class EnumClass
{
    [DataMember]
    protected internal String Key;
    [DataMember]
    protected internal Byte Numeral;

    public EnumClass(String _key, Byte _number)
    {
        Key = _key;
        Numeral = _number;
    }

    public static implicit operator int(EnumClass anEnum)
    {
        return anEnum.Numeral;
    }

    public static implicit operator string(EnumClass anEnum)
    {
        return anEnum.Key;
    }

    public override bool Equals(object obj)
    {
        bool result = false;
        if (obj.GetType() == typeof(EnumClass))
            result = Equals((EnumClass)obj);
        else if (obj.GetType() == typeof(int))
            result = Equals((int)obj);
        else if (obj.GetType() == typeof(String))
            result = Equals(obj.ToString());
        return result;
    }

    public override String ToString()
    {
        return Key;
    }        

    public bool Equals(EnumClass anEnum)
    {
        return anEnum.Equals((int)Numeral);
    }

    public bool Equals(int value)
    {
        return Numeral == (byte)value;
    }

    public bool Equals(string value)
    {
        return Key == value;
    }

    public override int GetHashCode()
    {
        //return Key.GetHashCode() ^ Numeral.GetHashCode();
        int result = 0;
        unchecked // Overflow is fine, just wrap
        {
            result = (int)2166136261;
            result = ShiftBits.ShiftAndWrap((result * 16777619) ^ Numeral, 2);
            for (int x = 0; x < Key.Length; x++)
            {
                result = ShiftBits.ShiftAndWrap((result * 16777619) ^ Key[x], 2);
            }

        }
        return result;
    }
}
...