C# 序列化和反序列化对象列表,不中断封装
我有一个名为Member的类,我想将其保存并加载到XML文件中 以下是我的加载/保存方法C# 序列化和反序列化对象列表,不中断封装,c#,serialization,C#,Serialization,我有一个名为Member的类,我想将其保存并加载到XML文件中 以下是我的加载/保存方法 public T LoadGenericDataType<T>(string filename) { XmlSerializer xms = new XmlSerializer(typeof(T)); FileStream fileStream = new FileStream(this._rootFolder + filena
public T LoadGenericDataType<T>(string filename)
{
XmlSerializer xms = new XmlSerializer(typeof(T));
FileStream fileStream = new FileStream(this._rootFolder + filename, FileMode.Open, FileAccess.ReadWrite);
try
{
Object v = xms.Deserialize(fileStream);
fileStream.Close();
return (T) v;
}
catch (Exception e)
{
fileStream.Close();
throw e;
}
}
public bool SaveGenericDataType<T>(T data, string filename)
{
XmlSerializer xms = new XmlSerializer(typeof(T));
FileStream fileStream = new FileStream(this._rootFolder + filename, FileMode.Create, FileAccess.Write);
try
{
xms.Serialize(fileStream, data);
fileStream.Close();
return true;
}
catch (Exception e)
{
fileStream.Close();
return false;
}
}
public T LoadGenericDataType(字符串文件名)
{
XmlSerializer xms=新的XmlSerializer(typeof(T));
FileStream FileStream=newfilestream(this.\u rootFolder+filename,FileMode.Open,FileAccess.ReadWrite);
尝试
{
objectv=xms.Deserialize(fileStream);
fileStream.Close();
返回(T)v;
}
捕获(例外e)
{
fileStream.Close();
投掷e;
}
}
public bool SaveGenericDataType(T数据,字符串文件名)
{
XmlSerializer xms=新的XmlSerializer(typeof(T));
FileStream FileStream=newfilestream(this.\u rootFolder+filename,FileMode.Create,FileAccess.Write);
尝试
{
序列化(文件流、数据);
fileStream.Close();
返回true;
}
捕获(例外e)
{
fileStream.Close();
返回false;
}
}
在我的成员类中,我保存了一个名为Boats的属性,我不想将原始列表发送给任何其他类,所以我复制了它
public List<Boat> Boats
{
get => _boats; // this will break encapsulation, but will make it easier to serialize( bad design my me :/ )
set => _boats = value;
}
public List<Boat> Boats1
{
get
{
List<Boat> copyOfBoats = new List<Boat>(); // this will cause LOADING to fail not saving.
foreach (Boat boat in _boats)
{
copyOfBoats.Add(boat);
}
return copyOfBoats;
}
set => _boats = value;
}
公开列出船只
{
get=>\u;//这将破坏封装,但会使序列化更容易(糟糕的设计my me://)
set=>_=value;
}
公众名单船只1
{
得到
{
List copyOfBoats=new List();//这将导致加载失败,而不是保存。
foreach(船中船)
{
船的副本。添加(船);
}
归还船票副本;
}
set=>_=value;
}
我错过了什么?如果我尝试加载带有“Boats1”属性的xml,它将失败。好的,我成功地解决了这个问题
public List<Boat> Boats
{
get
{
if (_boats.Count == 0)
return _boats;
List<Boat> copyOfBoats = new List<Boat>(); .
foreach (Boat boat in _boats)
{
copyOfBoats.Add(boat);
}
return copyOfBoats;
}
set => _boats = value;
}
公开列出船只
{
得到
{
如果(_.Count==0)
返回船;
List copyOfBoats=新列表()。
foreach(船中船)
{
船的副本。添加(船);
}
归还船票副本;
}
set=>_=value;
}
但是,如果成员没有船,它仍然会破坏封装。也许可以试试
public List<Boat> Boats1
{
get
{
List<Boat> copyOfBoats = new List<Boat>();
if (_boats.Count > 0)
{
foreach (Boat boat in _boats)
{
copyOfBoats.Add(boat);
}
}
return copyOfBoats;
}
set => _boats = value;
}
public List Boats1
{
得到
{
List copyOfBoats=新列表();
如果(_.Count>0)
{
foreach(船中船)
{
船的副本。添加(船);
}
}
归还船票副本;
}
set=>_=value;
}
这将阻止它返回原始的船只列表。为什么失败?有例外吗?还有别的吗?你能提供一份工作吗?