gpt4 book ai didi

c# - 泛型 + XML 序列化 + 自定义对象

转载 作者:行者123 更新时间:2023-11-30 22:47:13 24 4
gpt4 key购买 nike

我正在尝试泛型,我有一个(不是那么)创建 XMLSerializer 类的好主意。我拼凑的代码如下:

public class Persist<T>
{
private string _path;
public Persist(string path) {
this._path = path;
}
public void save(T objectToSave)
{
XmlSerializer s = new XmlSerializer(typeof(T));
TextWriter w = new StreamWriter(this._path);
try { s.Serialize(w, objectToSave); }
catch (InvalidDataException e) { throw e; }
w.Close(); w.Dispose();
}
public T load()
{
XmlSerializer s = new XmlSerializer(typeof(T));
TextReader r = new StreamReader(this._path);
T obj;
try { obj = (T)s.Deserialize(r); }
catch (InvalidDataException e) { throw e; }
r.Close(); r.Dispose();
return obj;
}
}

问题是:它在 Persist<List<string>> 上运行良好或 Persist<List<int>>但不在Persist<List<userObject>>或任何其他自定义(但可序列化)对象。 userObject本身只是一个具有两个 {get;set;} 属性的类,我之前已经将其序列化。

我不确定我的 Persist 类(泛型)、XML 序列化代码或其他地方是否存在问题:( 非常感谢您的帮助~

编辑:

用户对象代码

public class userObject
{
public userObject(string id, string name)
{
this.id = id;
this.name = name;
}
public string id { get;private set; }
public string name { get;set; }
}

最佳答案

在我看来,您的代码应该可以正常工作 - 尽管它确实存在一些缺陷。

编辑:您的 userObject 类不可序列化。 Xml 序列化仅适用于具有公共(public)、无参数构造函数的类型——当前类不起作用。此外,您应该真的重写您的代码以避免显式调用 .Close().Dispose() 而更喜欢使用 在可能的情况下 - 如果在序列化过程中的任何时候发生错误并且您的方法因异常终止 - 因此不会调用 .Dispose(),您可能会获得随机文件锁定。

就个人而言,我倾向于使用仅用于序列化的对象层次结构,它只是存储在 xml 中的数据的容器,并避免任何行为 - 特别是副作用。然后,您可以使用一个易于使用的小基类来简化这一切。

我在我的项目中使用的是:

public class XmlSerializableBase<T> where T : XmlSerializableBase<T>
{
static XmlSerializer serializer = new XmlSerializer(typeof(T));
public static T Deserialize(XmlReader from) { return (T)serializer.Deserialize(from); }
public void SerializeTo(Stream s) { serializer.Serialize(s, this); }
public void SerializeTo(TextWriter w) { serializer.Serialize(w, this); }
public void SerializeTo(XmlWriter xw) { serializer.Serialize(xw, this); }
}

...将序列化器缓存在静态对象中,并简化了使用(在调用位置不需要通用类型参数。

使用它的实际类(class):

public class ArtistTopTracks {
public string name;
public string mbid;//always empty
public long reach;
public string url;
}

[XmlRoot("mostknowntracks")]
public class ApiArtistTopTracks : XmlSerializableBase<ApiArtistTopTracks> {
[XmlAttribute]
public string artist;
[XmlElement("track")]
public ArtistTopTracks[] track;
}

示例序列化调用:

using (var xmlReader = XmlReader.Create([...])) 
return ApiArtistTopTracks.Deserialize(xmlReader);
//[...]

ApiArtistTopTracks toptracks = [...];
toptracks.SerializeTo(Console.Out);

关于c# - 泛型 + XML 序列化 + 自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com