teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

14

日本語の修正

2021/09/27 16:00

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -6,12 +6,12 @@
6
6
 
7
7
  ### 追記
8
8
 
9
- XmlSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら実際そのようです
9
+ XmlSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら下記質問が見つかりました
10
10
  [Force XML serialization to serialize readonly property](https://stackoverflow.com/questions/5585364/force-xml-serialization-to-serialize-readonly-property)
11
11
 
12
12
  set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。
13
13
 
14
- それもか疑問に思ったのでふと調べたら公式のガイドラインがりました。
14
+ ただし質的な解決策か疑問に思ったのでふと調べたら次は公式のガイドラインが見つかりました。
15
15
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
16
16
 
17
17
  XmlSerializer の代わりに [DataContractSerializer](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0) でも XML のシリアル化・逆シリアル化ができるようです。

13

文章の修正

2021/09/27 16:00

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -16,6 +16,7 @@
16
16
 
17
17
  XmlSerializer の代わりに [DataContractSerializer](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0) でも XML のシリアル化・逆シリアル化ができるようです。
18
18
 
19
+ これを使う場合は
19
20
  > Data-MemberAttribute を持つすべてのプロパティに getter と setter を実装してください
20
21
 
21
22
  とのことなので、get-only プロパティだと駄目かもしれませんがサンプルにもある通り private set で定義してコンストラクタ経由でなら逆シリアル化できると思います。

12

追記

2021/09/27 09:58

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -14,6 +14,8 @@
14
14
  それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
15
15
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
16
16
 
17
+ XmlSerializer の代わりに [DataContractSerializer](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0) でも XML のシリアル化・逆シリアル化ができるようです。
18
+
17
19
  > Data-MemberAttribute を持つすべてのプロパティに getter と setter を実装してください
18
20
 
19
21
  とのことなので、get-only プロパティだと駄目かもしれませんがサンプルにもある通り private set で定義してコンストラクタ経由でなら逆シリアル化できると思います。

11

誤字

2021/09/27 09:43

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ### 追記
8
8
 
9
- XMLSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら実際そのようです。
9
+ XmlSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら実際そのようです。
10
10
  [Force XML serialization to serialize readonly property](https://stackoverflow.com/questions/5585364/force-xml-serialization-to-serialize-readonly-property)
11
11
 
12
12
  set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。

10

typo

2021/09/27 09:34

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  [DataContract]
24
24
  public class Person
25
25
  {
26
- public Person2(string firstName, string lastName)
26
+ public Person(string firstName, string lastName)
27
27
  {
28
28
  LastName = lastName;
29
29
  FirstName = firstName;

9

文章の修正

2021/09/27 09:33

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > public set可能なプロパティを定義しつつも、public setを呼び出すつもりがない処理でそのクラスのインスタンスを扱うときには呼び出しをしないことをコード上明確にし、誤って呼び出したときにはコンパイルエラーとする良い方法
2
2
 
3
- set できるプロパティがあるという条件が付いた場合はそのような方法はありません。
3
+ public set できるプロパティがあるという条件が付いた場合はそのような方法はありません。
4
4
 
5
5
  set キーワードを使うのではなくプロパティを [get-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#get-only) として定義してコンストラクタで初期化するか、C# 9.0 以降で使える [init-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#init-only) を使ってください。
6
6
 
@@ -11,8 +11,6 @@
11
11
 
12
12
  set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。
13
13
 
14
- ### 追記2
15
-
16
14
  それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
17
15
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
18
16
 

8

文章の修正

2021/09/27 09:32

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  > Data-MemberAttribute を持つすべてのプロパティに getter と setter を実装してください
20
20
 
21
- とのことなので、get-only だと駄目かもしれませんがサンプルにもある通り private set で定義してコンストラクタ経由でなら逆シリアル化できると思います。
21
+ とのことなので、get-only プロパティだと駄目かもしれませんがサンプルにもある通り private set で定義してコンストラクタ経由でなら逆シリアル化できると思います。
22
22
  ```C#
23
23
  using System.Runtime.Serialization;
24
24
 

7

文章の修正

2021/09/27 09:30

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -16,7 +16,9 @@
16
16
  それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
17
17
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
18
18
 
19
+ > Data-MemberAttribute を持つすべてのプロパティに getter と setter を実装してください
20
+
19
- 下記ように private set 経由で初期すれば実現できると思います。
21
+ ことなので、get-only だと駄目かもしれませんがサンプルもある通り private set で定義してコンストラクタ経由でなら逆シリアル化できると思います。
20
22
  ```C#
21
23
  using System.Runtime.Serialization;
22
24
 

6

typo

2021/09/27 09:30

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -34,4 +34,5 @@
34
34
 
35
35
  [DataMember]
36
36
  public string FirstName { get; private set; }
37
+ }
37
38
  ```

5

文章の修正

2021/09/27 09:28

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -16,6 +16,22 @@
16
16
  それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
17
17
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
18
18
 
19
- > Data-MemberAttribute を持つすべてプロパティgetter setter を装してくださ
19
+ 下記ようprivate set 経由で初期化すれば現できると思ます。
20
+ ```C#
21
+ using System.Runtime.Serialization;
20
22
 
23
+ [DataContract]
24
+ public class Person
25
+ {
26
+ public Person2(string firstName, string lastName)
27
+ {
28
+ LastName = lastName;
29
+ FirstName = firstName;
30
+ }
31
+
32
+ [DataMember]
21
- と書いてある通り get のみの逆シリアル化は用意されていないと思います。
33
+ public string LastName { get; private set; }
34
+
35
+ [DataMember]
36
+ public string FirstName { get; private set; }
37
+ ```

4

文章の修正

2021/09/27 09:27

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -16,4 +16,6 @@
16
16
  それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
17
17
  [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
18
18
 
19
- 試してはいませんが上記を見る限りでは [System.Runtime.Serialization.OnDeserializedAttribute](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.ondeserializedattribute?view=net-5.0)使えば実現できるます。
19
+ > Data-MemberAttribute持つすべてのプロパティに getter setter を実装してくださ
20
+
21
+ と書いてある通り get のみの逆シリアル化は用意されていないと思います。

3

追記

2021/09/27 09:16

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -9,4 +9,11 @@
9
9
  XMLSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら実際そのようです。
10
10
  [Force XML serialization to serialize readonly property](https://stackoverflow.com/questions/5585364/force-xml-serialization-to-serialize-readonly-property)
11
11
 
12
- set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。
12
+ set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。
13
+
14
+ ### 追記2
15
+
16
+ それも本当か疑問に思ったのでふと調べたら公式のガイドラインがありました。
17
+ [シリアル化のガイドライン](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/serialization-guidelines)
18
+
19
+ 試してはいませんが上記を見る限りでは [System.Runtime.Serialization.OnDeserializedAttribute](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.ondeserializedattribute?view=net-5.0) を使えば実現できると思います。

2

追記

2021/09/27 09:12

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -2,4 +2,11 @@
2
2
 
3
3
  set できるプロパティがあるという条件が付いた場合はそのような方法はありません。
4
4
 
5
- set キーワードを使うのではなくプロパティを [get-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#get-only) として定義してコンストラクタで初期化するか、C# 9.0 以降で使える [init-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#init-only) を使ってください。
5
+ set キーワードを使うのではなくプロパティを [get-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#get-only) として定義してコンストラクタで初期化するか、C# 9.0 以降で使える [init-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#init-only) を使ってください。
6
+
7
+ ### 追記
8
+
9
+ XMLSerializer を使う場合は読み取り専用でも逆シリアル化できるのか気になり、ふと調べたら実際そのようです。
10
+ [Force XML serialization to serialize readonly property](https://stackoverflow.com/questions/5585364/force-xml-serialization-to-serialize-readonly-property)
11
+
12
+ set アクセサーで NotSupportedException をスローさせることで触れないようにしているようなので XMLSerializer を使う場合はこれが現実的な解決策かもしれません。

1

文章の修正

2021/09/27 09:04

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  set できるプロパティがあるという条件が付いた場合はそのような方法はありません。
4
4
 
5
- set キーワードを使うのではなくプロパティを [get-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#get-only) として定義してコンストラクタで初期化するか、C# 9.0 以降で使える [init only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#init-only)を使ってください。
5
+ set キーワードを使うのではなくプロパティを [get-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#get-only) として定義してコンストラクタで初期化するか、C# 9.0 以降で使える [init-only プロパティ](https://ufcpp.net/study/csharp/oo_property.html#init-only) を使ってください。