CRM の Web リソースに、いくつかの構成データを JSON として追加しました。C# プラグインでデシリアライズしようとすると、最初に Base 64 文字列をデコードし、次に UTF バイトをエンコードする必要があります。以前に CRM の外でこれを行ったことがあり、問題はありませんでしたが、引数例外「無効な JSON プリミティブ: .」が原因で JSON が逆シリアル化されていないときに、CRM でループが発生しました。
CRMにはUTFプリアンブルが含まれており、それは有効なJSONではないため、削除する必要があることが最終的にわかりました。以下は私の現在の解決策ですが、プリアンブルが何であるかを確認し、正しいエンコーディングを正しく適用して、プリアンブルなしで結果を返すバイトをエンコードする (またはデコードする) 標準的な方法があると思います。
private static Settings Deserialize(WebResource value) {
if (value == null)
{
throw new ArgumentNullException("value");
}
// By Default, Content is stored in a Base64String with a UTF preamble.
var content = Encoding.UTF8.GetString(Convert.FromBase64String(value.Content));
var preamble = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (content.StartsWith(preamble))
{
content = content.Remove(0, preamble.Length);
}
return new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Settings>(content);
}
確かにこれを行うためのより標準的な方法はありますか?