通用对象到“|”分隔的字符串序列化

发布于 2024-09-29 03:58:32 字数 1461 浏览 5 评论 0原文

我为 .net 2.0 编写了这个类方法,用于从“|”分隔的字符串创建对象,反之亦然。

但问题是,在继承类型的情况下,它们没有给出正确的结果,即继承的属性排在最后,并且以“|”分隔的字符串形式提供的数据序列不起作用。

例如:

class A
{
    int ID;
}

class B : A
{
    string Name;
}

字符串是“1|John”。这些方法读取为 name==1 和 ID==“John”。

请告诉我该怎么做。

public class ObjectConverter<T>
    {
        public static T TextToObject(string text)
        {
            T obj = Activator.CreateInstance<T>();
            string[] data = text.Split('|');
            PropertyInfo[] props = typeof(T).GetProperties();
            int objectPropertiesLength = props.Length;            

            int i = 0;

            if (data.Length == objectPropertiesLength)
            {
                for (i = 0; i < objectPropertiesLength; i++)
                {
                    props[i].SetValue(obj, data[i], null);
                }
            }

            return obj;
        }

        public static string ObjectToText(T obj)
        {
            StringBuilder sb = new StringBuilder();

            Type t = typeof(T);

            PropertyInfo[] props = t.GetProperties();

            int i = 0;
            foreach (PropertyInfo pi in props)
            {
                object obj2 = props[i++].GetValue(obj, null);

                sb.Append(obj2.ToString() + "|");
            }

            sb = sb.Remove(sb.Length - 1, 1);

            return sb.ToString();
        }
    }

I have written this class-methods for .net 2.0 to create objects from '|'-separated strings and vise-versa.

But the problem is, they are not giving right results in case of Inherted types, i.e. inherited properties are coming last and the sequence of the data supplied in the form of a '|'-separated string is not working.

For example:

class A
{
    int ID;
}

class B : A
{
    string Name;
}

the string is "1|John". the methods are reading as the name==1 and ID=="John".

Please tell me how to do it.

public class ObjectConverter<T>
    {
        public static T TextToObject(string text)
        {
            T obj = Activator.CreateInstance<T>();
            string[] data = text.Split('|');
            PropertyInfo[] props = typeof(T).GetProperties();
            int objectPropertiesLength = props.Length;            

            int i = 0;

            if (data.Length == objectPropertiesLength)
            {
                for (i = 0; i < objectPropertiesLength; i++)
                {
                    props[i].SetValue(obj, data[i], null);
                }
            }

            return obj;
        }

        public static string ObjectToText(T obj)
        {
            StringBuilder sb = new StringBuilder();

            Type t = typeof(T);

            PropertyInfo[] props = t.GetProperties();

            int i = 0;
            foreach (PropertyInfo pi in props)
            {
                object obj2 = props[i++].GetValue(obj, null);

                sb.Append(obj2.ToString() + "|");
            }

            sb = sb.Remove(sb.Length - 1, 1);

            return sb.ToString();
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

星光不落少年眉 2024-10-06 03:58:32
  • 我认为运行时不能向您保证,当您调用 getproperties 时,属性信息对象将始终保持相同的顺序。您将需要执行诸如获取属性名称列表之类的操作,对它们进行排序,并使用相同的排序进行序列化和反序列化。

  • 至少有 3 种方法可以序列化 .net 中内置的对象,您是否有理由不使用其中一种

  • I don't think the runtime assures you that when you call getproperties the property info objects will always be in the same order. You will need to do something like get the list of property names sort them and use the same sorting for serialization and deserialization .

  • There are at least 3 ways to serialize object built into .net is there a reason why you are not using one of those

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文