2017-08-19 26 views
-1

抽象クラスのISerializableアイテムのリストを含むISerializableクラスがありますが、派生クラスの実際のオブジェクトはISerializableではありません。 ScheduledTasksControllerを逆シリアル化しようとすると、コンストラクタが呼び出され、scheduledTasksが正しく逆シリアル化されます。ただし、リストのアイテムはnullであり、シリアル化が正しく機能してもScheduledTaskのコンストラクタは呼び出されません。私が間違って何をすることができるかについてのアイデア?前もって感謝します。以下ISerializableリストアイテムは、BinaryFormatterで逆シリアル化されません。 C#Xamarin

コード:

[Serializable] 
public class ScheduledTasksController:ISerializable 
{ 
    private List<ScheduledTask> scheduledTasks = new List<ScheduledTask>(); 

    public ScheduledTasksController(SerializationInfo info, StreamingContext context) 
    { 
     scheduledTasks = (List<ScheduledTask>)info.GetValue("tasks", typeof(List<ScheduledTask>)); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("tasks", scheduledTasks, typeof(List<ScheduledTask>)); 
    } 
} 

[Serializable] 
public abstract class ScheduledTask:ISerializable 
{ 
    public ScheduledTask(SerializationInfo info, StreamingContext context) 
    { 
     //code 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     //code 
    } 
} 

[Serializable] 
public class RepeatingScheduledTask : ScheduledTask 
{ 
    //code 
} 

[Serializable] 
public class OneTimeScheduledTask : ScheduledTask 
{ 
    //code 
} 
+0

「//コード」が何も見ずにアドバイスをするのは難しいです。 – mjwills

答えて

0

あなたが実際にシリアル化機能(インタフェースを実装)を提供する必要があります。これには、含まれているすべてのオブジェクトの逐次化関数を呼び出すことが含まれます。 Serialiseable Lists and Arraysは、デフォルトでこれを行います。そして現在のアドバイスされたものはすべてISerialiseableを適切に実装しています。

デフォルトの(シリアライザ)シリアライザは、すべてのパブリックフィールドのみをカバーできます。もっと複雑なもの(プライベートで読み取り専用のプロパティでさえ)は、それを超えています。

関連する問題