2

我有以下文字:

id=1
familyName=Rooney
givenName=Wayne
middleNames=Mark
dateOfBirth=1985-10-24
dateOfDeath=
placeOfBirth=Liverpool
height=1.76
twitterId=@WayneRooney

行用“\n”分隔,对用“=”分隔。

我有一个 Person 类,其中包含 Id、FamilyName、GivenName 等属性。

是否有任何简单的方法可以将上述文本反序列化为 Person 对象,然后使用正确的行和对分隔符将 Person 对象序列化为上述文本?

我希望有类似 TextSerializer 的东西?

基本上,我需要从文件中读取文本,例如 person1.txt,然后将其反序列化为 Person 对象。

如果可能的话,我想避免为每个属性手动硬编码。谢谢,

4

3 回答 3

2

反射可以在这里提供帮助,无需硬编码属性名称和使用第三方库

var person = Deserialize<Person2>("a.txt");

T Deserialize<T>(string fileName)
{
    Type type = typeof(T);
    var obj = Activator.CreateInstance(type);
    foreach (var line in File.ReadLines(fileName))
    {
        var keyVal = line.Split('=');
        if (keyVal.Length != 2) continue;

        var prop = type.GetProperty(keyVal[0].Trim());
        if (prop != null)
        {
            prop.SetValue(obj, Convert.ChangeType(keyVal[1], prop.PropertyType));
        }
    }
    return (T)obj;
}

public class Person2
{
    public int id { set; get; }
    public string familyName { set; get; }
    public string givenName { set; get; }
    public string middleNames { set; get; }
    public string dateOfBirth { set; get; }
    public string dateOfDeath { set; get; }
    public string placeOfBirth { set; get; }
    public double height { set; get; }
    public string twitterId { set; get; }
}
于 2012-12-04T18:20:38.020 回答
1

这也是一个可能的解决方案。如果可能,您可以尝试在创建时将文本格式化为 json。所以你不需要所有这些治疗。只需使用Json.net

public class Person
{
    public int id { set; get; }
    public string familyName { set; get; }
    public string givenName { set; get; }
    public string middleNames { set; get; }
    public string dateOfBirth { set; get; }
    public string dateOfDeath { set; get; }
    public string placeOfBirth { set; get; }
    public double height { set; get; }
    public string twitterId { set; get; }
}

class Program
{
    static void Main(string[] args)
    {
        string line;
        string newText = "{";

        System.IO.StreamReader file =  new System.IO.StreamReader("c:\\test.txt");

        while ((line = file.ReadLine()) != null)
        {
            newText += line.Insert(line.IndexOf("=") + 1, "\"") + "\",";

        }
        file.Close();

        newText = newText.Remove(newText.Length -1);
        newText = newText.Replace("=", ":");
        newText += "}";


        Person Person = JsonConvert.DeserializeObject<Person>(newText);

        Console.ReadLine();
    }
}

希望这有帮助。

于 2012-12-04T18:43:24.260 回答
0

正如其他人所提到的,您有几种选择:

  1. 加载文件,将其转换为可与 XMLSerializer/DataContract 一起使用的 XML
  2. 使用 IFormatter 编写自己的序列化程序
  3. 通过读取文件手动执行(下面的示例)

    类人 { 公共 int ID { 获取;放; } 公共字符串 FamilyName { 获取;放; }

    public Person(string file)
    {
        if (!File.Exists(file))
            return;
    
        string[] personData = File.ReadAllLines(file);
    
        foreach (var item in personData)
        {
            string[] itemPair = item.Split('='); //do some error checking here to see if = isn't appearing twice
            string itemKey = itemPair[0];
            string itemValue = itemPair[1];
            switch (itemKey)
            {
                case "familyName":
                    this.FamilyName = itemValue;
                    break;
                case "id":
                    this.ID = int.Parse(itemValue);
                    break;
                default:
                    break;
            }
    
        }
    }
    

    }

于 2012-12-04T18:12:36.403 回答