質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2414閲覧

DataMemberAttribute 属性でマークしてくださいとは何をすればいいのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2022/11/10 10:58

編集2022/11/10 23:52

提示コードですがwebサイトのログインするコードなのですが以下の///のコードで以下の例外が発生しています。DataMemberAttribute 属性でマークしてくださいとはどういう意味なのでしょうか?
参考サイトのazureの設定今回の場合とは違う思います。

内部例外
InvalidDataContractException: 型 'test4.Program+Hero' をシリアル化できません。この型を DataContractAttribute 属性でマークするか、シリアル化するすべてのメンバーを DataMemberAttribute 属性でマークしてください。この型がコレクションの場合は、CollectionDataContractAttribute 属性でマークすることを検討してください。その他のサポートされている型については、Microsoft .NET Framework のマニュアルを参照してください。
参考サイト

まねたサイト: http://www.surferonwww.info/BlogEngine/post/2019/09/29/call-aspnet-web-api-from-httpclien.aspx
マイクロソフトリファレンス:https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer.writeobject?view=net-7.0#system-runtime-serialization-json-datacontractjsonserializer-writeobject(system-io-stream-system-object)
azure: https://www.ipentec.com/document/microsoft-azure-add-api-access-permission-to-azure-active-directory-application

cs

1using Newtonsoft.Json; 2using System; 3using System.Collections.Generic; 4using System.IO; 5using System.Linq; 6using System.Net.Http; 7using System.Runtime.Serialization.Json; 8using System.Text; 9using System.Threading.Tasks; 10 11namespace test4 12{ 13 internal class Program 14 { 15 16 public class Token 17 { 18 public string access_token { get; set; } 19 20 public string token_type { get; set; } 21 22 public int expires_in { get; set; } 23 24 public string userName { get; set; } 25 } 26 27 // Web API に POST 送信するデータ 28 public class Hero 29 { 30 public int Id { get; set; } 31 32 public string Name { get; set; } 33 } 34 35 private static string loginUrl = "https://mstdn.jp/login"; 36 private static string apiUrl = "https://mstdn.jp/"; 37 private static string email = "XXXX@gmail.com"; 38 private static string passsword = "XXXXXXXX"; 39 private static int id = 6; 40 private static string name = "sample"; 41 private static string token = "XXXXXXXXXX"; 42 43 private static async Task f() 44 { 45 46 var client = new HttpClient(); 47 client.DefaultRequestHeaders.Add("User-Agent","Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"); 48 49 // POST 送信を指定 50 var request = new HttpRequestMessage(HttpMethod.Post, apiUrl); 51 52 // POST 送信する JSON 文字列 53 string postData = ""; 54 55 // Hero オブジェクトを生成しそれを JSON 文字列に 56 // シリアライズする 57 Hero postHero = new Hero(); 58 postHero.Id = 0; 59 postHero.Name = "test"; 60 61 62 // シリアライズは DataContractJsonSerializer を使う 63 using (MemoryStream stream = new MemoryStream()) 64 { 65 var ser = new DataContractJsonSerializer(typeof(Hero)); 66 67 Console.WriteLine("testestesete"); 68 ////////////////////////////////////////////////////////////////////////////////////////////////// 69 ser.WriteObject(stream, postHero); 70 /////////////////////////////////////////////////////////////////////////////////////////////////// 71 72 Console.WriteLine("あさあああ"); 73 74 stream.Position = 0; 75 using (var reader = new StreamReader(stream)) 76 { 77 78 79 postData = reader.ReadToEnd(); 80 } 81 82 } 83 84 // Content-Type: application/json; charset=utf-8 が 85 // 要求ヘッダに必要。それを POST 送信する JSON 文字 86 // 列と共にここで設定 87 request.Content = new StringContent(postData, 88 Encoding.UTF8, 89 "application/json"); 90 91 // 認証トークンを要求ヘッダに設定 92 request.Headers.Add("Authorization", 93 "Bearer " + token); 94 95 // JSON 文字列を SendAsync で POST 送信する 96 var response = await client.SendAsync(request); 97 98 // 応答コンテンツを Stream として取得 99 using (Stream responseStream = 100 await response.Content.ReadAsStreamAsync()) 101 { 102 // JSON シリアライザの初期化 103 //var ser = new DataContractJsonSerializer(typeof(List<Hero>)); 104 /* 105 // 応答コンテンツを逆シリアル化して C# のオブジ 106 // ェクトを取得 107 List<Hero> heros = 108 (List<Hero>)ser.ReadObject(responseStream); 109 110 string result = ""; 111 foreach (Hero hero in heros) 112 { 113 result += string.Format("{0}: {1}\r\n", 114 hero.Id, hero.Name); 115 116 117 } 118 */ 119 //this.textBox5.Text = result; 120 } 121 122 123 124 125 126 //HttpResponseMessage res = await client.GetAsync("https://mstdn.jp/api/v1/timelines/public?limit=2"); 127 128 //Console.WriteLine(response.EnsureSuccessStatusCode()); 129 130 //string responseBody = await response.Content.ReadAsStringAsync(); 131 //var responseBody = res.Content.ReadAsStringAsync().Result; 132 133 //var contents = response.Content.ReadAsStringAsync().Result; 134 //var json = JsonConvert.DeserializeObject(responseBody); 135 136 137 138 // Above three lines can be replaced with new helper method below 139 // string responseBody = await client.GetStringAsync(uri); 140 141 //Console.WriteLine(json); 142 } 143 144 private static async void t() 145 { 146 Task.WaitAll(f()); 147 } 148 149 150 static void Main(string[] args) 151 { 152 t(); 153 154 155 Console.ReadKey(); 156 } 157 } 158} 159

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

原因

[DataContract],[DataMember]の二つが抜けていた。

cs

1 // Web API に POST 送信するデータ 2 [DataContract] 3 internal class Hero 4 { 5 [DataMember] 6 public int Id { get; set; } 7 8 [DataMember] 9 public string Name { get; set; } 10 } 11

参考サイト:https://www.lisz-works.com/entry/cs-datacontractjsonserializer

投稿2022/11/11 00:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問