2011-11-18 5 views
8

Я хотел бы иметь возможность получить фактическое состояние или семя или что-то другое из System.Random, поэтому я могу закрыть приложение, и когда пользователь перезапустит его, он просто «перезагружает» его сохраненным и продолжает, как никогда. закрыто.Есть ли способ захватить фактическое состояние System.Random?

Возможно ли это?

Используя идею Джона, я придумал это, чтобы проверить это;

static void Main(string[] args) 
{ 
    var obj = new Random(); 
    IFormatter formatter = new BinaryFormatter(); 
    Stream stream = new FileStream("c:\\test.txt", FileMode.Create, FileAccess.Write, FileShare.None); 
    formatter.Serialize(stream, obj); 
    stream.Close(); 
    for (var i = 0; i < 10; i++) 
     Console.WriteLine(obj.Next().ToString()); 

    Console.WriteLine(); 

    formatter = new BinaryFormatter(); 
    stream = new FileStream("c:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.Read); 
    obj = (Random)formatter.Deserialize(stream); 
    stream.Close(); 
    for (var i = 0; i < 10; i++) 
     Console.WriteLine(obj.Next().ToString()); 

    Console.Read(); 
} 

ответ

10

Это сериализации, так что вы можете обнаружить, что вы можете просто использовать BinaryFormatter и сохранить массив байтов ...

Пример кода:

using System; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

public class Program 
{ 
    public static void Main(String[] args) 
    { 
     Random rng = new Random(); 
     Console.WriteLine("Values before saving..."); 
     ShowValues(rng); 

     BinaryFormatter formatter = new BinaryFormatter(); 
     MemoryStream stream = new MemoryStream(); 
     formatter.Serialize(stream, rng); 

     Console.WriteLine("Values after saving..."); 
     ShowValues(rng); 

     stream.Position = 0; // Rewind ready for reading 
     Random restored = (Random) formatter.Deserialize(stream); 

     Console.WriteLine("Values after restoring..."); 
     ShowValues(restored);  
    } 

    static void ShowValues(Random rng) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      Console.WriteLine(rng.Next(100)); 
     } 
    } 
} 

Результаты на образце перспективе являются многообещающими:

Values before saving... 
25 
73 
58 
6 
33 
Values after saving... 
71 
7 
87 
3 
77 
Values after restoring... 
71 
7 
87 
3 
77 

Понятно, что я не увлекаюсь встроенной сериализацией, но если это для реасо возможно, быстро и грязно взломать, это должно быть хорошо ...

+0

Я постараюсь на моей стороне, я буду следить за ним в то же время – Fredou

+0

спасибо :-), работаю красиво, я не думал о сериализации :-( – Fredou

+0

, посмотрев созданный файл, похоже сохраняя все или некоторые из случайных чисел, сгенерированных ранее. Это может стать большим. Вы знаете, как исправить эту проблему? – Fredou

0

Я не парень C#, поэтому у меня нет ресурсов, чтобы увидеть исходный код, но семя должно храниться в классе. Из его документации класс не запечатан, поэтому вы должны иметь возможность создавать подкласс. В этом подклассе вы можете создать функцию для возврата текущего семени. При выключении вашего приложения вы можете сохранить семя (файлы «обезьяны базы данных» с хорошей памятью?), А затем загрузить его обратно при запуске нового приложения.

Это дополнительное преимущество, позволяющее вам восстановить из любой ранее сохраненной точки, для целей резервного копирования или чего-то еще.

+0

У вас есть основания полагать, что семя является частью публичного (или защищенного) API класса? Наследование не поможет, если семя является частной деталью реализации, производные классы не будут иметь доступ. –

+0

@ Энтони, я сказал, что у меня нет исходного кода. Полагаю, я мог бы сказать, что у меня нет убедительных доказательств в поддержку этого, так что нет, я этого не делаю. Для меня, похоже, что-то логично включить в ваш защищенный API. – corsiKa

+0

Я посмотрю на это, так как мне не нравится то, что я вижу в сохраненном файле из сериализации – Fredou

Смежные вопросы