質問編集履歴

1

コンパイル可能なソースを追記

2021/09/27 09:33

投稿

aki107205
aki107205

スコア1

test CHANGED
File without changes
test CHANGED
@@ -76,6 +76,186 @@
76
76
 
77
77
  ```
78
78
 
79
+ ### 動かせるソースコード例(追記)
80
+
81
+
82
+
83
+ ```C#
84
+
85
+ using System;
86
+
87
+ using System.Collections.Generic;
88
+
89
+ using System.IO;
90
+
91
+ using System.Linq;
92
+
93
+ using System.Text;
94
+
95
+ using System.Threading.Tasks;
96
+
97
+ using System.Xml.Serialization;
98
+
99
+
100
+
101
+ namespace TestApp
102
+
103
+ {
104
+
105
+ class Program
106
+
107
+ {
108
+
109
+ static void Main(string[] args)
110
+
111
+ {
112
+
113
+ //新規データ作成(デスクトップ)
114
+
115
+ string xmlFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "myData.xml");
116
+
117
+ var generator = new MyDataGenerator();
118
+
119
+ generator.GenerateAndSave(xmlFile);
120
+
121
+
122
+
123
+ //ファイルからロード
124
+
125
+ MyData myData = MyDataLoader.Load(xmlFile);
126
+
127
+
128
+
129
+ //利用(編集しない)
130
+
131
+ var user = new MyDataUser();
132
+
133
+ user.UseData(myData);
134
+
135
+
136
+
137
+ Console.ReadLine();
138
+
139
+ }
140
+
141
+ }
142
+
143
+
144
+
145
+ [XmlRoot("myData")]
146
+
147
+ public class MyData
148
+
149
+ {
150
+
151
+ public MyData() { }
152
+
153
+
154
+
155
+ [XmlElement("data1")]
156
+
157
+ public string Data1 { get; set; }
158
+
159
+
160
+
161
+ [XmlElement("data2")]
162
+
163
+ public string Data2 { get; set; }
164
+
165
+ }
166
+
167
+
168
+
169
+
170
+
171
+ class MyDataGenerator
172
+
173
+ {
174
+
175
+ public void GenerateAndSave(string path)
176
+
177
+ {
178
+
179
+ var myData = new MyData();
180
+
181
+ myData.Data1 = "abcde"; //実際はユーザー入力などを受け取って設定する
182
+
183
+ myData.Data2 = "fghij";
184
+
185
+
186
+
187
+ var xmlSerializer1 = new XmlSerializer(typeof(MyData));
188
+
189
+ using (var streamWriter = new StreamWriter(path, false, Encoding.UTF8))
190
+
191
+ {
192
+
193
+ xmlSerializer1.Serialize(streamWriter, myData);
194
+
195
+ streamWriter.Flush();
196
+
197
+ }
198
+
199
+ }
200
+
201
+ }
202
+
203
+
204
+
205
+ static class MyDataLoader
206
+
207
+ {
208
+
209
+ public static MyData Load(string path)
210
+
211
+ {
212
+
213
+ var xmlSerializer = new XmlSerializer(typeof(MyData));
214
+
215
+ MyData myData;
216
+
217
+ using (var streamReader = new StreamReader(path, Encoding.UTF8))
218
+
219
+ using (var xmlReader = System.Xml.XmlReader.Create(streamReader))
220
+
221
+ {
222
+
223
+ myData = (MyData)xmlSerializer.Deserialize(xmlReader);
224
+
225
+ }
226
+
227
+
228
+
229
+ return myData;
230
+
231
+ }
232
+
233
+ }
234
+
235
+
236
+
237
+ class MyDataUser
238
+
239
+ {
240
+
241
+ public void UseData(MyData myData)
242
+
243
+ {
244
+
245
+ myData.Data1 = "hogehoge"; //コンパイルを通したくない
246
+
247
+ Console.WriteLine(myData.Data1);
248
+
249
+ Console.WriteLine(myData.Data2);
250
+
251
+ }
252
+
253
+ }
254
+
255
+ }
256
+
257
+ ```
258
+
79
259
 
80
260
 
81
261
  ### 自分で考えた実現方法
@@ -101,3 +281,9 @@
101
281
  DataContractSerializerを使ってsetをprivateにし、新規作成はコンストラクタ引数で行うようにすれば背景の問題は解消しそうな気がしていますが、xmlのデータ順が縛られる上、データクラスへの変更が大きいため二の足を踏んでいます。
102
282
 
103
283
  また背景に囚われずに一般論として質問のようなことが出来るか/どうやって行うか興味があるため質問させていただきました。
284
+
285
+
286
+
287
+ ### 補足情報(追記)
288
+
289
+ C# 7.2 / .NET4.6.1の環境を使用しています。