将name = value格式的字符串反序列化为object

时间:2013-03-09 14:56:53

标签: c#

我想读取文件,每个文件都包含一个人的详细信息,如下所示,并将其转换为Person对象。

隐藏在

之下
id=1
firstName=John
lastName=Smith

要:

public class Person
{

   public int Id {get;set;}
   public string FirstName{get;set;}
   public string LastName{get;set;}

}

是否有.NET内置方法来执行此操作,或第三方库。我无法通过谷歌找到它。

更新

无法更改文件格式。

5 个答案:

答案 0 :(得分:3)

.NET实际上是XML,因此您无法找到类似INI格式的内置功能。但是有很多库可以很容易地读取和写入这样的文件,例如ini-parsernini,但您仍需要手动映射对象和从对象进行映射。

答案 1 :(得分:1)

例如使用File.ReadAllLines,一点Linq和String.Substring

var lines = File.ReadAllLines(path).Select(l => l.Trim());
var idLine = lines.FirstOrDefault(l => l.StartsWith("id=", StringComparison.OrdinalIgnoreCase));
var lNameLine = lines.FirstOrDefault(l => l.StartsWith("lastname=", StringComparison.OrdinalIgnoreCase));
var fNameLine = lines.FirstOrDefault(l => l.StartsWith("firstname=", StringComparison.OrdinalIgnoreCase));
if (idLine != null && lNameLine != null && fNameLine != null)
{
    Person person = new Person()
    {
        Id = int.Parse(idLine.Substring(idLine.IndexOf("=") + 1)),
        FirstName = fNameLine.Substring(fNameLine.IndexOf("=") + 1),
        LastName = lNameLine.Substring(lNameLine.IndexOf("=") + 1)
    };
}

(假设每个文件只有一个人)

但我会使用不同的格式,如XML(当然还有数据库)。

答案 2 :(得分:1)

您可以使用String.Split和LINQ:

来解析文本
Dictionary<string, string> dict = text
    .Split(new[] { Environment.NewLine }, StringSplitOptions.None)
    .Select(e => e.Split('='))
    .ToDictionary(strings => strings[0], strings => strings[1]);

然后使用类似Dictionary Adapter的内容。

答案 3 :(得分:0)

我认为您应该考虑将输入数据格式更改为更标准的格式(如XML或JSON)。

但这并不意味着你根本无法阅读你的档案。您应该自己阅读文本文件:

var people = new List<Person>();
using (var stream = File.OpenRead("Input.txt"))
{
    using (var reader = new StreamReader(stream))
    {

        while (!reader.EndOfStream)
        {
            int id = int.Parse(reader.ReadLine().Substring(3));
            string firstName = reader.ReadLine().Substring(10);
            string lastName = reader.ReadLine().Substring(9);

            var newPerson = new Person()
            {
                Id = id,
                FirstName = firstName,
                LastName = lastName
            };

            people.Add(newPerson);
        }
    }
}

答案 4 :(得分:-1)

如果您的数据格式如下:

<Person>
<Id>1</Id>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Person>

然后这个C#代码将序列化为Person的实例

//assuming you have a string called "data" that contains the above XML.
XDocument xd=XDocument.Parse(data); //needs System.Xml.Linq for XDocument type.
using(var reader = xd.CreateReader())
{
    using(XmlSerializer ser = new XmlSerializer(typeof(Person))
    {
       Person p = ser.Deserialize(reader) as Person;
       //p will be null if it didn't work, so make sure to check it!
    }
}

请注意,反序列化器区分大小写,因此您需要确保元素大小写与类中属性的大小写相匹配(您可以通过使用序列化程序属性修饰属性来告诉序列器如何映射它们来获取此属性{ {3}})

普通的本机序列化器非常适合这样的简单对象,但是可以在某些数据类型(例如char,bool等)上绊倒你,所以检查输出链接的属性。

如果您想从问题中提供的格式进行操作,则需要编写自定义序列化程序,在您的情况下,我的建议是从您的文件中读取并使用{{3从数据生成XML希望有所帮助。