4

リスト内のポイント データを protobuf.net で作成されたバイナリ ファイルに保存しようとしています。これ自体に問題はありませんが、テキストエディターで簡単に表示できる形式でデータを保存しようとしています。デフォルトでは、List of Point 構造体をテキスト ファイルに保存すると、各ポイントの x と y が ASCII テキストとして表示されます。

    [global::ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"BufPoints", DataFormat = global::ProtoBuf.DataFormat.Default)]
    private List<Point> BufPoints
    {
        get
        {
            return this.Points;
        }
        set
        {

            this.Points = value;

        }
    }

x と y の double データを保存する独自のクラスを作成しようとしましたが、ルーチンの一部にデータのディープ クローンが含まれており、このクローンを実行すると値が失われるようです。

[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"EncodedPoints", DataFormat = global::ProtoBuf.DataFormat.Default)]
    private List<Utils.PointConverter> EncodedPoints
    {
        get
        {
            List<Utils.PointConverter> temp = new List<Utils.PointConverter>();
            if (Points != null)
            {
                foreach (Point p in this.Points)
                {
                    temp.Add(new Utils.PointConverter(p));
                }
            }
            return temp;
        }
        set
        {
            if (value != null)
            {
                this.Points = new List<Point>();
                foreach (Utils.PointConverter pc in value)
                {
                    this.Points.Add(pc.GetPoint());
                }
            }

        }
    }

PointsConverter クラスは次のとおりです。

    [global::System.Serializable, global::ProtoBuf.ProtoContract(Name = @"PointConverter")]
class PointConverter
{
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name = @"X", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public double X;

    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name = @"Y", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public double Y;

    public PointConverter(System.Windows.Point point)
    {
        this.X = point.X;
        this.Y = point.Y;
    }

    public PointConverter()
    {

    }

    public System.Windows.Point GetPoint()
    {
        return new System.Windows.Point(X, Y);
    }
}

ディープクローン中に値が失われる理由がわかりません。ASCII 以外の形式で別の方法でデータを保存する方法や、ディープ クローンに関する問題に対処する方法はありますか?

4

1 に答える 1

2

まず、protobufはどの時点でもASCIIではありません(文字列値はUTF-8として格納されますが、アクセントのないラテン文字の場合はASCIIのように見えることがよくあります)-コンテキストなしでそこに表示されているものについてコメントすることはできませんが、シリアル化も暗号化ではありません。バイナリ形式を使用すると、誰かがコンテンツを読んだり編集したりするのが面倒になる可能性がありますが、セキュリティチェックの一部として使用しないでください。

コードに関して:私はあなたが物事を複雑にしすぎていると思います。実際、両方System.Drawing.PointSystem.Windows.Point場合、コードは「自動タプル」処理の一部としてマッピングを自動的に把握することに非常に近いです。しかし、完全ではありません!ただし、アプリのスタートアップに1行の構成の微調整を追加し、フィールド1およびフィールド2としてPoint格納することでシリアル化するように指示することで、簡単に教育できます。これは次のとおりです。.X.Y

// either or both; whatever you need
model.Add(typeof(System.Windows.Point), false).Add("X", "Y");
model.Add(typeof(System.Drawing.Point), false).Add("X", "Y");

Serializer.*または、デフォルトのモデルインスタンス(つまりメソッド)を使用している場合:

// either or both; whatever you need
RuntimeTypeModel.Default.Add(typeof(System.Windows.Point), false).Add("X", "Y");
RuntimeTypeModel.Default.Add(typeof(System.Drawing.Point), false).Add("X", "Y");

以上です!必要なのはそれだけです。Pointまたはのメンバーは、正しくシリアル化および逆シリアル化する必要がありますList<Point>Point[]

于 2012-11-07T20:44:21.567 に答える