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 to 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
```