C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: object型シリアライズ


(過去ログ 71 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■41553 / inTopicNo.1)  object型シリアライズ
  
□投稿者/ ライ (1回)-(2009/09/24(Thu) 10:50:59)

分類:[.NET 全般] 

object型にArrayListを代入してシリアライズをするとエラーが発生してしまいます。
ソースコードは下記の通りです。何か対処方法ありますでしょうか?
(object型は変えれません。)

  public static class MainProgram
    {
        
        public static void Start()
        {               
            SerializeDataFormat SaveObj = new SerializeDataFormat();            

            ArrayList ar = new ArrayList();
            ar.Add("1,2,3");
            ar.Add("4,5,6");            

            SaveObj.Name = "1234";
            SaveObj.Value = ar;

            System.Xml.Serialization.XmlSerializer serializer1 = 
      new System.Xml.Serialization.XmlSerializer(typeof(SerializeDataFormat));

            System.IO.FileStream fs1 = new System.IO.FileStream(@"C:\test.xml", System.IO.FileMode.Create);
            serializer1.Serialize(fs1, SaveObj);
            fs1.Close();
        }

    }
    public class SerializeDataFormat
    {
        public string Name { get; set; }        
        public object Value { get; set; }
    }





引用返信 編集キー/
■41554 / inTopicNo.2)  Re[1]: object型シリアライズ
□投稿者/ επιστημη (2170回)-(2009/09/24(Thu) 10:58:26)
επιστημη さんの Web サイト
> エラーが発生してしまいます。

どこで/どんな エラーになるのかくらいは書きましょうよ...

引用返信 編集キー/
■41555 / inTopicNo.3)  Re[1]: object型シリアライズ
□投稿者/ 渋木宏明(ひどり) (1228回)-(2009/09/24(Thu) 10:58:29)
渋木宏明(ひどり) さんの Web サイト
> object型にArrayListを代入してシリアライズをするとエラーが発生してしまいます。

ソースのどこら辺で、どんなエラーになるんでしょうか?

引用返信 編集キー/
■41556 / inTopicNo.4)  Re[2]: object型シリアライズ
□投稿者/ ライ (3回)-(2009/09/24(Thu) 11:31:41)
No41554 (επιστημη さん) に返信
>>エラーが発生してしまいます。
>
> どこで/どんな エラーになるのかくらいは書きましょうよ...
>

申し訳ありませんでした。
serializer1.Serialize(fs1, SaveObj);
の行で、「XML ドキュメントを生成中にエラーが発生しました。」とでます。

引用返信 編集キー/
■41557 / inTopicNo.5)  Re[3]: object型シリアライズ
□投稿者/ 中博俊 (1332回)-(2009/09/24(Thu) 11:48:23)
例外の中にInnerExceptionが入っていると思うので、それのメッセージとスタックトレースも書いてみて下さい。
引用返信 編集キー/
■41559 / inTopicNo.6)  Re[4]: object型シリアライズ
□投稿者/ ライ (4回)-(2009/09/24(Thu) 12:00:08)
No41557 (中博俊 さん) に返信
> 例外の中にInnerExceptionが入っていると思うので、それのメッセージとスタックトレースも書いてみて下さい。

System.InvalidOperationException はハンドルされませんでした。
Message="XML ドキュメントを生成中にエラーが発生しました。"
Source="System.Xml"
StackTrace:
場所 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
場所 System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
場所 System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o)
場所 WindowsFormsApplication1.MainProgram.Start() 場所 C:\MyData\自作ソフト\WindowsFormsApplication1\Program.cs:行 45
場所 WindowsFormsApplication1.Program.Main() 場所 C:\MyData\自作ソフト\WindowsFormsApplication1\Program.cs:行 21
場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidOperationException
Message="型 System.Collections.ArrayList をこのコンテキストで使うことはできません。"
Source="System.Xml"
StackTrace:
場所 System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
場所 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSerializeDataFormat.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
場所 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSerializeDataFormat.Write2_SerializeDataFormat(String n, String ns, SerializeDataFormat o, Boolean isNullable, Boolean needType)
場所 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSerializeDataFormat.Write3_SerializeDataFormat(Object o)
InnerException:

引用返信 編集キー/
■41561 / inTopicNo.7)  Re[5]: object型シリアライズ
□投稿者/ Hongliang (470回)-(2009/09/24(Thu) 12:44:22)
XmlSerializer は、シリアライズするインスタンス全ての型情報を事前に知っておかなければなりません。
普通はプロパティの型から情報を取得できますが、プロパティの型が基底クラスで、実際のインスタンスが派生クラスの場合、そのままでは XmlSerializer は事前に知ることができないことになります。
// 例外は string や int などのプリミティブ型ぐらいでしょうか。
SerializeDataFormat 型を変更することができないのなら、XmlSerializer のコンストラクタで、Type[] を引数に取るものを使い、この引数にシリアライズするインスタンスが持っているオブジェクトの型を全て指定する必要があります。
もちろん、ArrayList に格納されている各インスタンスについてもそうです。
引用返信 編集キー/
■41562 / inTopicNo.8)  Re[1]: object型シリアライズ
□投稿者/ こくぶん (24回)-(2009/09/24(Thu) 13:00:03)
No41553 (ライ さん) に返信
> (object型は変えれません。)

object 型でなければいけない理由は何でしょうか?
単にシリアライズの度に Value の型が違うだけであれば、ジェネリック型にして回避とかは出来ませんか?


=== 例 ===
public static class MainProgram {

    public static void Start() {
        var SaveObj = new SerializeDataFormat<ArrayList>();

        ArrayList ar = new ArrayList();
        ar.Add("1,2,3");
        ar.Add("4,5,6");

        SaveObj.Name = "1234";
        SaveObj.Value = ar;

        System.Xml.Serialization.XmlSerializer serializer1 =
                new System.Xml.Serialization.XmlSerializer(typeof(SerializeDataFormat<ArrayList>));

        System.IO.FileStream fs1 = new System.IO.FileStream(@"C:\test.xml", System.IO.FileMode.Create);
        serializer1.Serialize(fs1, SaveObj);
        fs1.Close();
    }
}

public class SerializeDataFormat<T> {
    public string Name { get; set; }
    public T Value { get; set; }
}


# SaveObj が更にリストで要素ごとに Value の型が違う、とか言われるとつらいかもしれないけど。。。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -