■21373 / inTopicNo.1) |
オブジェクトのデシリアライズがうまくいきません |
□投稿者/ やもり (4回)-(2008/07/01(Tue) 13:39:34)
|
分類:[.NET 全般]
やもりといいます。よろしくおねがいします。
開発環境:VS2008C# .NET framework 2.0用
オブジェクトをシリアライズして保存し、復元してロードするというごく単純なことをやっていると思うのですが、うまくいきません。
シリアライズについては、http://dobon.net/vb/dotnet/file/xmlserializer.htmlを参考にしました
セーブ、ロードのところは
void Save<T>(String saveFileName, T t)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (FileStream fs = new FileStream(saveFileName, FileMode.Create))
{
serializer.Serialize(fs, t);
}
}
new T Load<T>(String saveFileName)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
if(File.Exists(saveFileName))
{
using (FileStream fs = new FileStream(saveFileName, FileMode.Open))
{
T t = (T)serializer.Deserialize(fs);
/*bp*/ return t;
}
}
return default(T);
}
で、Loadを呼び出しているのが
projects = Load<List<Project>>(saveProjectsFileName);
Projectというクラスは
public class Project
{
String jamFileName;
String jarFolderName;
Server server;
bool doStartUpMonitor;
bool onMonitor;
DateTime lastWriteTime;
public Server Server { get { return server; } set { server = value; } }
public String JamFileName { get { return jamFileName; } set { jamFileName = value; } }
public String JarFolderName { get { return jarFolderName; } set { jamFileName = value; } }
public DateTime LastWriteTime { get { return lastWriteTime; } set { lastWriteTime = value; } }
public bool OnMonitor { get { return onMonitor; } set { onMonitor = value; } }
public bool DoStartUpMonitor { get { return doStartUpMonitor; } set { doStartUpMonitor = value; } }
public Project() { }
public Project(String jamFileName, String jarFolderName, Server server)
{
Set(jamFileName, jarFolderName, server);
}
public void Set(String jamFileName, String jarFolderName, Server server)
{
this.jamFileName = jamFileName;
this.jarFolderName = jarFolderName;
this.server = new Server(server.HostName, server.UserName, server.Password);
}
public override string ToString()
{
return Path.GetFileNameWithoutExtension(jamFileName);
}
}
public class Server
{
String hostName;
String userName;
String password;
public String HostName { get { return hostName; } set { hostName = value; } }
public String UserName { get { return userName; } set { userName = value; } }
public String Password { get { return password; } set { password = value; } }
public Server() { }
public Server(String hostName, String userName, String password)
{
Set(hostName, userName, password);
}
public void Set(String hostName, String userName, String password)
{
this.hostName = hostName;
this.userName = userName;
this.password = password;
}
public override string ToString()
{
return this.hostName;
}
}
という感じになっています。
問題はデシリアライズで、bpの時点でtを見てみると、Project.JamFileNameが保存したときのProject.JarFolderName
となっていて、Project.JarFolderName == nullとなっているんです。
シリアライズしたファイルを表示すると保存内容のとおりとなっています。
たとえば
<?xml version="1.0" ?>
- <ArrayOfProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <Project>
<JamFileName>ggggg</JamFileName>
<JarFolderName>hhdjasedjh</JarFolderName>
- <Server>
<HostName>w6.oroti.com</HostName>
<UserName>dbz</UserName>
<Password>kosakasi</Password>
</Server>
<LastWriteTime>0001-01-01T00:00:00</LastWriteTime>
<OnMonitor>false</OnMonitor>
<DoStartUpMonitor>false</DoStartUpMonitor>
</Project>
</ArrayOfProject>
をデシリアライズすると
List<Project> l
l.Count == 1
l[0].JamFileName == "hhdjasedjh"
l[0].JarFileName == null
となります。(それ以外はファイル通り)
なぜかわかりません。
ちなみにList<>がわるいのかなと思って1Projectごとに保存しても同じ現象が見られました
|
|