我有以下方法来保存一个对象到一个文件:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
我承认这不是我写的(我只是把它转换成一个接受类型参数的扩展方法)。
现在我需要它把xml作为字符串返回给我(而不是保存到文件中)。我正在调查这件事,但我还没有弄清楚。
我想对于熟悉这些物体的人来说,这可能很简单。如果没有,我最终会弄清楚的。
我知道这不是问题的真正答案,但根据问题的投票数和接受的答案,我怀疑人们实际上是在使用代码将对象序列化为字符串。
使用XML序列化会给输出增加不必要的额外文本垃圾。
对于下面的类
public class UserData
{
public int UserId { get; set; }
}
它生成
<?xml version="1.0" encoding="utf-16"?>
<UserData xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UserId>0</UserId>
</UserData>
更好的解决方案是使用JSON序列化(最好的方法之一是Json.NET)。
序列化一个对象:
var userData = new UserData {UserId = 0};
var userDataString = JsonConvert.SerializeObject(userData);
反序列化一个对象:
var userData = JsonConvert.DeserializeObject<UserData>(userDataString);
序列化的JSON字符串看起来像这样:
{"UserId":0}
我知道这不是问题的真正答案,但根据问题的投票数和接受的答案,我怀疑人们实际上是在使用代码将对象序列化为字符串。
使用XML序列化会给输出增加不必要的额外文本垃圾。
对于下面的类
public class UserData
{
public int UserId { get; set; }
}
它生成
<?xml version="1.0" encoding="utf-16"?>
<UserData xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UserId>0</UserId>
</UserData>
更好的解决方案是使用JSON序列化(最好的方法之一是Json.NET)。
序列化一个对象:
var userData = new UserData {UserId = 0};
var userDataString = JsonConvert.SerializeObject(userData);
反序列化一个对象:
var userData = JsonConvert.DeserializeObject<UserData>(userDataString);
序列化的JSON字符串看起来像这样:
{"UserId":0}
在极少数情况下,您可能希望实现自己的String序列化。
但这可能是个坏主意,除非你知道自己在做什么。(例如用批处理文件序列化I/O)
类似这样的方法就可以达到目的(而且手动/批处理编辑也很容易),但是要注意应该做更多的检查,比如名称不包含换行符。
public string name {get;set;}
public int age {get;set;}
Person(string serializedPerson)
{
string[] tmpArray = serializedPerson.Split('\n');
if(tmpArray.Length>2 && tmpArray[0].Equals("#")){
this.name=tmpArray[1];
this.age=int.TryParse(tmpArray[2]);
}else{
throw new ArgumentException("Not a valid serialization of a person");
}
}
public string SerializeToString()
{
return "#\n" +
name + "\n" +
age;
}