SORU
19 Aralık 2012, ÇARŞAMBA


C# nasıl tek yönlü hale, unserializable musunuz?

Çoğu zaman, bir nesne, ya da günlük veya hata ayıklama için seri hale getirmek lazım. Bu tek yönlü bir seri hale getirme, onu geri almak için ihtiyacım yok, daha sonra, sadece bir yere yazmak için bir dizeye nesneyi çevirmek gerekiyor.

... - Evet evet bu her zaman ToString yöntemi geçersiz etmelisiniz. Bunu biliyorum. Ama genellikle ben yazmadım ve değiştiremez nesneleri ile uğraşıyorum. Ayrıca, ben de yazmak her sınıf için bir yöntem Olabilirdi yazma güncellemek zorunda istemiyorum.

XML serileştirme görünüşte mükemmel bir çözüm dışarı XML nesnesi sadece dümdüz -- sunmaktadır. Ama C-seri hale mi o kadar çok sınırlamalar, özellikle vardır, ve parametresiz bir yapıcı olmalı. Derslerimde bu etrafında alabilirsiniz, ama yine sık sık diğer insanların sınıfları ile çalışıyorum.

Bir nesnenin kapsamlı bir dize gösterimini almak için çözüm ne? Atladığım basit bir şey var mı?

CEVAP
19 Aralık 2012, ÇARŞAMBA


Nasıl kendi mantığı ile uzatma yöntemi (ve belki biraz Yansıma)?

public static class SerializerExtension
{
    public static String OneWaySerialize(this Object obj)
    {
        if (Object.ReferenceEquals(obj, null))
        {
            return "NULL";
        }
        if (obj.GetType().IsPrimitive || obj.GetType() == typeof(String))
        {
            if (obj is String)
                return String.Format("\"{0}\"", obj);
            if (obj is Char)
                return String.Format("'{0}'", obj);
            return obj.ToString();
        }

        StringBuilder builder = new StringBuilder();
        Type objType = obj.GetType();
        if (IsEnumerableType(objType))
        {
            builder.Append("[");

            IEnumerator enumerator = ((IEnumerable)obj).GetEnumerator();
            Boolean moreElements = enumerator.MoveNext();
            while (moreElements)
            {
                builder.Append(enumerator.Current.OneWaySerialize());
                moreElements = enumerator.MoveNext();
                if (moreElements)
                {
                    builder.Append(",");
                }
            }

            builder.Append("]");
        }
        else
        {
            builder.AppendFormat("{0} {{ ", IsAnonymousType(objType) ? "new" : objType.Name);

            PropertyInfo[] properties = objType.GetProperties();
            for (Int32 p = properties.Length; p > 0; p--)
            {
                PropertyInfo prop = properties[p-1];
                String propName = prop.Name;
                Object propValue = prop.GetValue(obj, null);
                builder.AppendFormat("{0} = {1}", propName, propValue.OneWaySerialize());
                if (p > 1)
                {
                    builder.Append(", ");
                }
            }

            builder.Append(" }");
        }

        return builder.ToString();
    }

    // http://stackoverflow.com/a/2483054/298053
    private static Boolean IsAnonymousType(Type type)
    {
        if (type == null)
        {
            return false;
        }
        return Attribute.IsDefined(type, typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false)
            && type.IsGenericType && type.Name.Contains("AnonymousType")
            && (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
            && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;
    }

    private static Boolean IsEnumerableType(Type type)
    {
        if (type == null)
        {
            return false;
        }
        foreach (Type intType in type.GetInterfaces())
        {
            if (intType.GetInterface("IEnumerable") != null || (intType.IsGenericType && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
            {
                return true;
            }
        }
        return false;
    }
}

Yani: söylerim

someDefinedObject.OneWaySerialize();

Revisisons

  1. İlk sürümü
  2. Güncelleştirilmiş 12.26.2012
    • IEnumerable için kontrol eklendi (teşekkürler aboveyou00)
    • Ekledi anonim türünü kontrol edin (ve bu "yeni" ne zaman çıktı) . etiket sadece

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Chrome

    Google Chrom

    1 EYLÜL 2008
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006
  • WhtButterflyLiz

    WhtButterfly

    14 NİSAN 2008