Actual Behavior:
```// Create the serialize-based object
FileSerializer file_w = new FileSerializer();
file_w.Open("$profile:test.txt", FileMode.WRITE);
// Write complex object to it
array<string> test_array_w = { "Hello", "World" };
file_w.Write(test_array_w);
file_w.Close();
// Create another serializer
FileSerializer file_r = new FileSerializer();
file_r.Open("$profile:test.txt", FileMode.READ);
ref Class test_array_r;
// Try to read it to the Base class object
Print(file_r.Read(test_array_r)); // False
file_r.Close();
Print("Test array read: " + test_array_r);
array<string>.Cast(test_array_r).Debug(); // Error
```
Expected Behavior:
```// Create the serialize-based object
FileSerializer file_w = new FileSerializer();
file_w.Open("$profile:test.txt", FileMode.WRITE);
// Write complex object to it
array<string> test_array_w = { "Hello", "World" };
file_w.Write(test_array_w);
file_w.Close();
// Create another serializer
FileSerializer file_r = new FileSerializer();
file_r.Open("$profile:test.txt", FileMode.READ);
ref Class test_array_r;
// Try to read it into the Base class object
Print(file_r.ReadEx(test_array_r)); // True (Extended method for backward compatibility)
file_r.Close();
Print("Test array read: " + test_array_r);
array<string>.Cast(test_array_r).Debug(); // Unsafe upcast, but should be the same as test_array_w
```
I understand that Read method spawns a new base class object, but what if we can pass an argument not as a ref variable but as a typename
->
```
class Serializer
{
bool Read(void var_in); // the existed method
Class ReadEx(typename var_type); // Method that spawns and returns a new variable with type as the typename or null if error
}
```