1

我正在尝试将自定义对象从 RDC 窗口复制到主机(我的本地)机器中。它失败。这是我用于 1) 复制和 2) 粘贴的代码:

1) 远程(在 Windows XP 上运行的客户端通过 RDC 访问):

            //copy entry
            IDataObject ido = new DataObject();
            XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
            StringWriter sw = new StringWriter();
            x.Serialize(sw, new EntryForClipboard(entry));
            ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());
            Clipboard.SetDataObject(ido, true);

2) 本地(在本地 Windows XP x64 工作站上运行的客户端):

                //paste entry
                IDataObject ido = Clipboard.GetDataObject();
                DataFormats.Format cdf = DataFormats.GetFormat(typeof(EntryForClipboard).FullName);

                if (ido.GetDataPresent(cdf.Name)) //<- this always returns false
                {
                    //can never get here!
                    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
                    string xml = (string)ido.GetData(cdf.Name);
                    StringReader sr = new StringReader(xml);
                    EntryForClipboard data = (EntryForClipboard)x.Deserialize(sr);
                }

不过,它可以在同一台机器上完美运行。

有什么提示吗?

4

2 回答 2

1

您可以研究以下几件事:

  1. 您确定对象的序列化确实将其转换为 XML 吗?也许输出的 XML 引用了您的内存空间?尝试查看 XML 的文本来查看。
  2. 如果您确实有对象的序列化 XML 版本,为什么不将值存储为纯文本而不使用typeof(EntryForClipboard)?就像是:

    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
    StringWriter sw = new StringWriter();
    x.Serialize(sw, new EntryForClipboard(entry));
    Clipboard.SetText(sw.ToString(), TextDataFormat.UnicodeText);
    

    然后,您在客户端程序中所要做的就是检查剪贴板中的文本是否可以反序列化回您的对象。

于 2009-03-23T05:37:02.093 回答
1

好的,找到问题所在了。使用自定义格式复制 RDC 时,自定义格式名称会被截断为 16 个字符。在行

ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());

格式名称很长。

当我在主机上接收复制的数据时,可用的格式具有我的自定义格式,但被截断为 16 个字符。

IDataObject ido = Clipboard.GetDataObject();
ido.GetFormats(); //used to see available formats.

所以我只使用了一个较短的格式名称:

//to copy
ido.SetData("MyFormat", sw.ToString());
...
//to paste
DataFormats.Format cdf = DataFormats.GetFormat("MyFormat");
if (ido.GetDataPresent(cdf.Name)) {
  //this not works
  ...
于 2009-04-08T23:40:32.007 回答