2

逆シリアル化したいオブジェクトがあります。これは外部ライブラリで構造体として宣言されています (Serializable としてマークされています)。しかし、Json.net はこのオブジェクトを逆シリアル化できません。シリアル化は問題ありませんが、逆シリアル化は機能しません。すでに構造体をクラスに変更しようとしましたが、役に立ちませんでした。JsonSerializerSettings などに何か特別なものを入れる必要がありますか、それともサポートされていませんか? TypeNameHandling や TypeNameAssemblyFormat など、いくつかのパラメーターを既に試しましたが、うまくいきませんでした。

尋ねられたように、いくつかのコード、これは外部ライブラリで宣言されています:

[Serializable]
public struct BarEntry
{
    public RegistryValueKind One;
    public string Two;  
    public string Three;
    public string Four;
    public object Five;
}

[Serializable]
public struct FooEntry
{
    public string One;
    public string Two;
}

独自のプロジェクトで次のように連載:

Stream stream = System.IO.File.Open(fileName, FileMode.Create);
string json = JsonConvert.SerializeObject(entry, Formatting.None, new   JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.Write(json);
streamWriter.Flush();
stream.Close();

独自のプロジェクトで次のように逆シリアル化されます。

StreamReader streamReader = new StreamReader(input);
string json = streamReader.ReadToEnd();
object returnObject = JsonConvert.DeserializeObject<T>(json);
input.Close();
return returnObject;

独自のプロジェクト内のすべてがこのコードで正常に動作しますが、外部ライブラリからはオブジェクトを逆シリアル化できません (BarEntry と FooEntry の両方から)。

また、BarEntry と FooEntry は両方とも、ストレージ オブジェクトの同じプロパティに格納されます。

public object Entry { get; set; }
4

1 に答える 1

0

正確な型を JsonConvert.DeserializeObject に送信する必要があります。そうしないと、json 文字列から逆シリアル化するために必要なプロパティを持つ適切なオブジェクトを作成する方法がありません。したがって、この型を外部アセンブリから読み込み、Json.NET に送信します。このようなもの :

Assembly assembly = Assembly.LoadFile("ExternalAssembly.dll");
Type barEntryType = assembly.GetType("BarEntry");
var returnObject = JsonConvert.DeserializeObject(json, barEntryType);

または外部アセンブリを参照して、これを行うだけです:

BarEntry returnObject = JsonConvert.DeserializeObject<BarEntry>(json)
于 2012-06-09T11:08:06.160 に答える