2017-06-25 17 views
0

私はUWPアプリケーションを開発しています。このソリューションにはC#で書かれた多くのプロジェクト(データベースなど)が含まれていますが、UIはJavaScriptプロジェクトです。ファイルまたはアセンブリを読み込めませんでしたSystem.Runtime.Serialization.Xml

C#クラスの一つは、DataContractSerializerを使用して、データベースのコピーを保存するには、次のコードが含まれています。このコードは、JSから実行しますとき

public IAsyncOperation<Boolean> Save() 
{ 
    return Save(0).AsAsyncOperation<Boolean>(); 
} 

private async Task<Boolean> Save(Int32 notUsed) 
{ 
    try 
    { 
     updated = DateTime.Now; 

     StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync(id + ".xml", CreationCollisionOption.ReplaceExisting); 
     IRandomAccessStream access = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders); 
     Stream stream = access.AsStreamForWrite(); 

     DataContractSerializer serializer = new DataContractSerializer(typeof(Database)); 
     serializer.WriteObject(stream, this); 

     stream.Dispose(); 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

、私は次のエラーを取得する:

0x80070002 - JavaScript runtime error: The system cannot find the file specified. 
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.Serialization.Xml, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. 
WinRT information: System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.Serialization.Xml, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. 

誰かが私を正しい方向に向けることができれば、解決策をオンラインで見つけるのに苦労していますか?

ありがとうございました。

+0

Nugetパッケージを使用していますか? –

+0

いいえ、Nuget(またはそのサードパーティのパッケージ)パッケージを使用していません。 – SignalOne

答えて

0

データコントラクトへの参照をすべて削除し、それをカスタム関数に置き換えてJsonObjectを構築しました。私はそれをDataContractSerializerに頼るのではなく、ファイルに書きます。

データベース内の各クラスは、今と同様、ToJson機能を有する:

internal JsonObject ToJson() 
{ 
    JsonObject root = new JsonObject(); 
    root.Add(JSON_ID, JsonValue.CreateStringValue(Id)); 
    root.Add(JSON_DELETED, JsonValue.CreateBooleanValue(Deleted)); 
    root.Add(JSON_PHOTO, Photo != null ? Photo.ToJson() : null); 
    root.Add(JSON_PREFIX, JsonValue.CreateStringValue(Prefix)); 
    root.Add(JSON_GIVENNAME, JsonValue.CreateStringValue(GivenName)); 
    root.Add(JSON_MIDDLENAMES, JsonValue.CreateStringValue(MiddleNames)); 
    root.Add(JSON_FAMILYNAME, JsonValue.CreateStringValue(FamilyName)); 
    root.Add(JSON_SUFFIX, JsonValue.CreateStringValue(Suffix)); 
    root.Add(JSON_NOTES, JsonValue.CreateStringValue(Notes)); 
    return root; 
} 

各クラスはまた、JSONオブジェクトを受け入れるコンストラクタが含まれ、例えば:

internal Person(JsonObject root) : this() 
{ 
    Id = root.GetNamedString(JSON_ID, null); 
    Deleted = root.GetNamedBoolean(JSON_DELETED, false); 
    Photo = root.GetNamedObject(JSON_PHOTO, null) != null ? new Photo(root.GetNamedObject(JSON_PHOTO, null)) : null; 
    Prefix = root.GetNamedString(JSON_PREFIX, null); 
    GivenName = root.GetNamedString(JSON_GIVENNAME, null); 
    MiddleNames = root.GetNamedString(JSON_MIDDLENAMES, null); 
    FamilyName = root.GetNamedString(JSON_FAMILYNAME, null); 
    Suffix = root.GetNamedString(JSON_SUFFIX, null); 
    Notes = root.GetNamedString(JSON_NOTES, null); 
} 

私ができます

private async Task<Boolean> Save() 
{ 
    try 
    { 
     updated = DateTime.Now; 

     StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync(id + ".json", CreationCollisionOption.ReplaceExisting); 
     await FileIO.WriteTextAsync(file, ToJson().Stringify()); 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

これを使用してファイルに書き込みます。

private static async Task<Database> Open(String id) 
{ 
    try 
    { 
     StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(id + ".json"); 
     return new Database(JsonObject.Parse(await FileIO.ReadTextAsync(file))); 
    } 
    catch (Exception) 
    { 
     return null; 
    } 
} 

これらのすべてが、データ契約を混乱させるよりも簡単でした。

関連する問題