0

私がやりたいのは、PreferencesGoogleChromeブラウザのファイルから2つの値を変更することです。私が今使っているコードは以下の通りです

[DataContract]
public class Mdata
{
    [DataMember(Name = "homepage")]
    public String homepage { get; private set; }
    [DataMember(Name = "homepage_is_newtabpage")]
    public Boolean isNewTab { get; private set; }
    [DataMember(Name = "keep_everything_synced")]
    public Boolean isSynced { get; private set; }
    public Mdata() { }
    public Mdata(String data)
    {
        homepage = data;
    }
}

public static Mdata FindData(String json)
{
    Mdata deserializedData = new Mdata();
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
    DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedData.GetType());
    deserializedData = ser.ReadObject(ms) as Mdata;
    ms.Close();
    return deserializedData;
}

private void button1_Click(object sender, EventArgs e)
{
    const int LikeWin7 = 6;
    OperatingSystem osInfo = Environment.OSVersion;
    DirectoryInfo strDirectory;
    String path = null, file = null, data;

    if (osInfo.Platform.Equals(System.PlatformID.Win32NT))
        if (osInfo.Version.Major == LikeWin7)
            path = Environment.GetEnvironmentVariable("LocalAppData") +
                @"\Google\Chrome\User Data\Default";
    if (path == null || path.Length == 0)
        throw new ArgumentNullException("Fail. Bad OS.");
    if (!(strDirectory = new DirectoryInfo(path)).Exists)
        throw new DirectoryNotFoundException("Fail. The directory was not fund");
    if (!new FileInfo(file = Directory.GetFiles(strDirectory.FullName, "Preferences*")[0]).Exists)
        throw new FileNotFoundException("Fail. The file was not found.", file);

    Mdata info = FindData(data = System.IO.File.ReadAllText(file));
    Console.WriteLine(info.homepage); // show me http://www.google.com
    Console.WriteLine(info.isNewTab); // prints false
    MessageBox.Show(info.isSynced); // prints true
    }

私が今やりたいのは、info.homepage、info.isNewTab、info.isSyncedの値を他の値に変更して(設定ファイル内で)次のようにすることです。

"homepage": "http://www.myWebsite.com/",
"homepage_is_newtabpage": true,
...
"keep_everything_synced": false,

私はこのような新しい値を直接設定しようとしました:

 info.homepage = "www.mysite.com";
 info.isNewTab = true;
 info.isSynced = false;

しかし、チャンスはありません!

上記の3つのオブジェクトに新しい値を割り当てるにはどうすればよいですか?

4

2 に答える 2

2

投稿したコードには2つの問題があります。

  1. データをディスクに書き戻すことはありません。
  2. 関心のある3つのプロパティのみをマップしました。これは、それらのみが逆シリアル化されることを意味します。また、それらを変更してディスクに書き戻すと、他のすべてのデータがデータ構造に組み込まれていないため、これらのプロパティのみがシリアル化されます。

あなたの問題にはいくつかの可能な解決策があります:

  1. 構造内の設定ファイルを完全にマップしますMdata。設定ファイルが非常に大きいため、これは明らかに少し面倒です。
  2. この質問に対する受け入れられた答えは、任意のJSONオブジェクトを辞書に逆シリアル化する方法を示しています。
  3. JSON逆シリアル化はまったく使用しないでください。ファイルを開いて1行ずつ読み取り、正規表現を使用して必要な設定に一致させます。値が見つかったら、値を置き換えます。そして、各行を書き戻します(変更または未変更)。
于 2012-04-07T19:16:39.920 に答える
1

ここで行ったように、逆シリアル化されたオブジェクトを取得したら、次のようにします。

Mdata info = FindData(data = System.IO.File.ReadAllText(file));

これらのプロパティに必要な値を割り当てます。

 info.homepage = "www.mysite.com";
 info.isNewTab = true;
 info.isSynced = false;

次に、オブジェクトをシリアル化してファイルに戻し、上書きします。これは欠落しているビットです-変更をディスクに書き込むことは決してありません。

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Mdata));
using(var fs = new FileStream(filePath, FileMode.Create)
{
  ser.WriteObject(fs, info);
}
于 2012-04-07T09:29:35.323 に答える