Post数据
低层客户端允许您直接发布string
或byte[]
数组。 除此之外,如果您传递一个string
或object
的集合,它们将使用Elasticsearch的特殊bulk/multi (批量/多)格式进行序列化。
隐式转换
即使在低级别客户端上PostData的参数需要PostData<object>
,您可以依靠隐式转换来完全抽象PostData的概念。 您可以从以下类型隐式转换
-
string
-
byte[]
- collection of
string
- collection of
object
-
object
我们来演示一些断言的例子
PostData<object> fromString = @string;
PostData<object> fromByteArray = bytes;
PostData<object> fromListOfString = collectionOfStrings;
PostData<object> fromListOfObject = collectionOfObjects;
PostData<object> fromObject = @object;
fromByteArray.WrittenBytes.Should().BeSameAs(bytes);
WrittenBytes
将始终设置,如果它源自byte[]
var fromString = ImplicitlyConvertsFrom(@string);
var fromByteArray = ImplicitlyConvertsFrom(bytes);
var fromListOfString = ImplicitlyConvertsFrom(listOfStrings);
var fromListOfObject = ImplicitlyConvertsFrom(listOfObjects);
var fromObject = ImplicitlyConvertsFrom(@object);
PostData字节始终设置,如果它源自byte[]
romByteArray.WrittenBytes.Should().BeSameAs(bytes);
fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);
Type属性代表构建post数据的原始类型
fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);
并将PostData<object>
实例传递给接受PostData<object>
作为参数的方法不会再次包装
fromString = MethodThatAcceptsPostData(fromString);
fromByteArray = MethodThatAcceptsPostData(fromByteArray);
fromListOfString = MethodThatAcceptsPostData(fromListOfString);
fromListOfObject = MethodThatAcceptsPostData(fromListOfObject);
fromObject = MethodThatAcceptsPostData(fromObject);
fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);
每个隐式转换的类型的行为略有不同。
对于string
,在请求中发送UTF-8字节,并为该字节分配WrittenBytes
属性
await Post(() => @string, writes: Utf8Bytes(@string), writtenBytesIsSet: true, settings: settings);
类似地,对于byte[]
,字节逐字地发送,WrittenBytes
属性被分配字节
await Post(() => bytes, writes: bytes, writtenBytesIsSet: true, settings: settings);
当传递string
的集合时,客户端会认为它是有效的序列化json的集合,因此每个都加入换行符,确保有一个尾随的换行符。 与string
和byte[]
一样,WrittenBytes
属性分配了字符串集合的UTF-8字节
await Post(() => collectionOfStrings, writes: utf8BytesOfListOfStrings, writtenBytesIsSet: true, settings: settings);
当传递object
的集合时,客户端会认为它是一个需要单独序列化的对象的集合,并且与换行符加入。 与收集字符串一样,客户端确保有一个尾随的换行符。
await Post(() => collectionOfObjects, writes: utf8BytesOfCollectionOfObjects, writtenBytesIsSet: false, settings: settings);
在所有其他情况下,Post数据按原样序列化,WrittenBytes
未分配
await Post(() => @object, writes: utf8ObjectBytes, writtenBytesIsSet: false, settings: settings);
强制写入字节设置
如果要保留出现的请求的副本,可以在ConnectionConfiguration
上设置DisableDirectStreaming
。 在这样做时,序列化的字节首先被写入专用的MemoryStream
,以便客户机可以获得串行化的字节
settings = new ConnectionConfiguration().DisableDirectStreaming();
await Post(() => collectionOfObjects, writes: utf8BytesOfCollectionOfObjects, writtenBytesIsSet: true, settings: settings);
当使用DisableDirectStreaming
启用序列化简单对象时也可以观察到此行为
await Post(() => @object, writes: utf8ObjectBytes, writtenBytesIsSet: true, settings: settings);