C# 序列化和反序列化对象列表,不中断封装

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

我有一个名为Member的类,我想将其保存并加载到XML文件中

以下是我的加载/保存方法

    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;
}

这将阻止它返回原始的船只列表。

为什么失败?有例外吗?还有别的吗?你能提供一份工作吗?