如果我在C#中有一个数据结构(例如,我们只说一个存储一些字符串的向量),是否可以在sql表中存储向量的内容?我想这样做,以便快速将该数据转换为矢量格式尽可能快,而不必按元素构造它.几乎像将二进制数据写入一个文件,然后读取它并将其复制到一个分配的结构中.
我在sql Server 2008上创建了一个表,其中一个字段定义为VARBINARY(MAX).我以为我会从这开始.
有人会告诉我一个例子,说明我将如何从这个字段中存储和检索一个10字符串的向量?这是否可能(我不能想到为什么不)?
谢谢!
解决方法
其次,如果您有一个可序列化的对象,则可以将其存储在sql Server中.我曾经做到这一点,并且在sql Server中使用了Text数据类型来存储XML.
意见:我喜欢将序列化对象存储为XML而不是二进制数据.为什么?因为您可以实际读取那里的内容(用于调试),而在sql Server中,您可以使用XQuery从序列化对象中选择数据.从我的经验来看,使用二进制数据的性能获益并不值得,因为数据更容易调试,可以以伪装关系的方式使用.看看SQL Server’s XQuery capabilities.即使你不打算立即使用它,没有理由把自己放在一个角落.
你可以看一些使用NetDataContractSerializer的例子.
我相信你所说的一个向量是List<>在C#中.看看System.Collections.Generic.您可以使用NetDataContractSerializer序列化3个字符串的列表,如:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.IO; namespace SerializeThingy { class Program { static void Main(string[] args) { List<string> myList = new List<string>(); myList.Add("One"); myList.Add("Two"); myList.Add("Three"); NetDataContractSerializer serializer = new NetDataContractSerializer(); MemoryStream stream = new MemoryStream(); serializer.Serialize(stream,myList); stream.Position = 0; Console.WriteLine(ASCIIEncoding.ASCII.GetString(stream.ToArray())); List<string> myList2 = (List<string>)serializer.Deserialize(stream); Console.WriteLine(myList2[0]); Console.ReadKey(); } } }
该示例只是序列化一个列表,将序列化输出到控制台,然后证明它在正确的水平正确.我想你可以看到,从这里可以将内存流转储到一个字符串中,并将其写入数据库,或使用另一种流类型而不是内存流来实现.
请记住参考System.Runtime.Serialization以访问NetDataContractSerializer.