2

型のプロパティを持つクラスをシリアル化しようとしてTextRangeいます。

例:

public class MyClass
{
    private string someProp;
    public string SomeProp
    {
        get { return someProp; }
        set { someProp = value; }
    }

    private TextRange myTextRange;
    public TextRange MyTextRange
    {
        get { return myTextRange; }
        set { myTextRange = value; }
    }
}

問題は、クラス全体をシリアル化している間、TextRange型を定期的にシリアル化できないことです。それ自体をシリアル化するための独自の特別なメソッドがあります。私は次のようにしています:

using (MemoryStream ms = new MemoryStream())
{
    myTextRange.Save(ms, DataFormats.Xaml, true);
    string xaml = Encoding.ASCII.GetString(ms.ToArray());
}

TextRange問題は、クラスをプロパティと他のプロパティを一緒に 1 つの文字列 (xml 文字列) にシリアル化することです。別のシリアル化方法 (xml ではない) を使用してもかまいませんが、問題がどのように解決されるかわかりません。

定期的にクラス全体を一度にシリアライズしますが、TextRangeクラスはシリアライズ可能 (バイナリ シリアライゼーションなし) としてマークされておらず、空のコンストラクター (xml シリアライゼーションなし) を持っていません。

それが私が定期的に行う方法です:

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
StringWriter stringWriter = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(stringWriter))
{
    serializer.Serialize(writer, this);
    string xml = stringWriter.ToString();
    return xml;
}

これどうやってするの?

4

1 に答える 1

0

まあ、興味のある人のために。問題は、MyClass オブジェクト全体を 1 つの xml 文字列にシリアル化したいということでした。しかし、TextRange には、メインの投稿で書いたような特別なシリアル化メソッドが必要です。したがって、回避策は次のとおりです。

  • MyClass 内にパブリック ヘルパー クラス (MyClassSerializationHelper など) を作成します。

  • MyClass プロパティと同じですが、文字列として 2 つの文字列プロパティを追加します。私の場合、SomeProp と MyTextRange です。完全なプロパティ (ゲッターとセッター)。

シリアル化するには:

  • MyClassSerializationHelper インスタンスを作成します。

  • SomeProp は MyClass の SomeProp プロパティから同じ値を取得します。これは文字列であるためです。

  • MyTextRange は、特別なシリアル化メソッドを使用して、MyClass MyTextRange プロパティのシリアル化された文字列を取得します。

  • MyClassSerializationHelper インスタンス全体をシリアル化すると、xml 文字列が得られます。

デシリアライズするには:

  • xml 文字列を逆シリアル化し、MyClassSerializationHelper インスタンスを取得します。

  • MyTextRange プロパティ (xml 文字列) をデシリアライズして、TextRange インスタンスを取得します。

  • 逆シリアル化したプロパティを使用して MyClass インスタンスを再構築します。

それが明らかであることを願っています。

于 2016-11-11T22:23:28.347 に答える