タイトル通りなのですが、Form1で以下のような構造体を作り、保存することまではできました。
form1
c#
1public struct summonerData 2 { 3 string name; 4 string id; 5 string accountID; 6 string profileIconID; 7 long revisionDate; 8 int summonerLevel; 9 public summonerData(string ID, string AccountID, string Name, string ProfileIconID,long RevisionData,int SummonerLevel) 10 { 11 name = Name; 12 id = ID; 13 accountID = AccountID; 14 profileIconID = ProfileIconID; 15 revisionDate = RevisionData; 16 summonerLevel = SummonerLevel; 17 } 18 19public summonerData MyData;
c#
1 public class dataSave 2 { 3 string dataPath = System.IO.Directory.GetCurrentDirectory() + @"\data\"; 4 5 public void MydataSave(Form1.summonerData Mydata) 6 { 7 int size = Marshal.SizeOf(Mydata); 8 byte[] by = new byte[size]; 9 IntPtr ptr = Marshal.AllocHGlobal(size); 10 11 //マネージオブジェクトからアンマネージメモリにデータをマーシャリング 12 Marshal.StructureToPtr(Mydata, ptr, false); 13 14 //アンマネージデータをマネージのbyte[]にコピーする 15 Marshal.Copy(ptr, by, 0, size); 16 Marshal.FreeHGlobal(ptr); 17 18 System.IO.DirectoryInfo di =System.IO.Directory.CreateDirectory(dataPath); 19 System.IO.FileStream fs = new System.IO.FileStream(dataPath + "Mydata.data",System.IO.FileMode.Create,System.IO.FileAccess.Write); 20 //バイト型配列の内容をすべて書き込む 21 fs.Write(by, 0, by.Length); 22 //閉じる 23 fs.Close(); 24 } 25 26 public Form1.summonerData MydataLoad() 27 { 28 System.IO.FileStream fs = new System.IO.FileStream(dataPath +"Mydata.data" ,System.IO.FileMode.Open,System.IO.FileAccess.Read); 29 30 //ファイルのバイト長だけバイト配列を作成 31 byte[] bs = new byte[fs.Length]; 32 //ファイルの内容をすべて読み込む 33 fs.Read(bs, 0, bs.Length); 34 35 36 37 Form1.summonerData Mydata; 38 39 int size = bs.Length; 40 IntPtr ptr = Marshal.AllocHGlobal(size); 41 Marshal.Copy(bs, 0, ptr, size); 42 Mydata = (Form1.summonerData)Marshal.PtrToStructure(ptr, typeof(Form1.summonerData)); 43 Marshal.FreeHGlobal(ptr); 44 45 46 fs.Close(); 47 48 return Mydata; 49 50 } 51 52 }
MyDataという構造体にデータを入力後、MydataSave MydataLoadでバイナリに変換し、読み書きを行おうとしたのですが、
アプリ起動→データを保存→読み込み ということは可能。
アプリ起動→データの読み込み エラーという現象が起こっています。(もちろん保存データのファイルがある状態で)
エラー内容と箇所は
Mydata = (Form1.summonerData)Marshal.PtrToStructure(ptr, typeof(Form1.summonerData));
型 'System.AccessViolationException' のハンドルされていない例外が mscorlib.dll で発生しました
追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
アプリ起動中に保存してから読み込みは可能なのにアプリ終了後に読み込もうとすると、エラーが出るのがちょっと納得出来ないのですが、なぜなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/16 16:13